তিথি, নক্ষত্র, করণ ও যোগ কোনো civil-date label নয়। এগুলো সূর্য ও চন্দ্রের চলমান দ্রাঘিমা থেকে নির্ণীত angular segment। Clock time কেবল সেই segment-এর পরবর্তী boundary-তে পৌঁছানোর স্থানীয় সময়। তাই একটি নির্ভরযোগ্য পঞ্জিকা engine প্রথমে angle ও state নির্ণয় করবে, তারপর boundary instant খুঁজবে, এবং সবশেষে selected timezone ও ভাষায় ফল দেখাবে।
পঞ্জিকার “শেষ সময়” বলতে কী বোঝায়?
রাষ্ট্রীয় পঞ্জিকাসহ প্রচলিত almanac-এ তিথি, নক্ষত্র, যোগ বা করণের পাশে যে সময় লেখা হয়, তা সাধারণত ঐ অঙ্গটির ending moment। উদাহরণ:
এখানে sunrise-এ ত্রয়োদশী চলছিল। রাত ১০:১৪:৫০-এ সূর্য থেকে চন্দ্রের angular separation পরবর্তী ১২°-এর গুণিতকে পৌঁছেছে। সেই instant-এর আগে ত্রয়োদশী, boundary instant থেকে চতুর্দশী। “পর্যন্ত” শব্দটি display convention; machine model-এ ownership স্পষ্ট করতে transition instant এবং from/to state আলাদা field-এ রাখা উচিত।
চার অঙ্গের angular ভিত্তি
নিচের সব angle ০° থেকে ৩৬০°-এর মধ্যে normalize করা হয়েছে। λS হলো সূর্যের দ্রাঘিমা এবং λM চন্দ্রের দ্রাঘিমা। Project profile অনুযায়ী এগুলো traditional Surya Siddhanta অথবা modern ephemeris-ভিত্তিক হতে পারে; কিন্তু একই report-এর চার অঙ্গে একই declared coordinate profile ব্যবহার করতে হবে।
| অঙ্গ | মূল angle | এক অংশ | মোট অংশ |
|---|---|---|---|
| তিথি | Normalize(λM − λS) | ১২° | ৩০ |
| নক্ষত্র | Normalize(λM) | ১৩°২০′ | ২৭ |
| করণ | Normalize(λM − λS) | ৬° | ৬০ half-tithi slot |
| যোগ | Normalize(λM + λS) | ১৩°২০′ | ২৭ |
১৩°২০′-কে decimal-এ 360.0 / 27.0 হিসেবেই রাখুন; rounded 13.33 ব্যবহার করলে প্রতি boundary-তে error জমবে। Name array zero-based হলেও user-facing ordinal এক-based।
তিথি: সূর্য থেকে চন্দ্রের প্রতি ১২° দূরত্ব
অমাবস্যার মুহূর্তে সূর্য ও চন্দ্রের দ্রাঘিমা সমান; elongation ০°। চন্দ্র সূর্যের চেয়ে এগিয়ে ১২° হলে শুক্ল প্রতিপদ শেষ এবং দ্বিতীয়া শুরু। ৩৬০° synodic cycle-এ ৩০টি তিথি:
TithiIndex = floor(E / 12°) → 0 … 29
| Elongation | তিথি | পরের boundary |
|---|---|---|
| ০° ≤ E < ১২° | শুক্ল প্রতিপদ | ১২° |
| ১২° ≤ E < ২৪° | শুক্ল দ্বিতীয়া | ২৪° |
| ১৫৬° ≤ E < ১৬৮° | শুক্ল চতুর্দশী | ১৬৮°—পূর্ণিমার শুরু |
| ১৬৮° ≤ E < ১৮০° | পূর্ণিমা | ১৮০°—কৃষ্ণপক্ষের শুরু |
| ১৮০° ≤ E < ১৯২° | কৃষ্ণ প্রতিপদ | ১৯২° |
| ৩৪৮° ≤ E < ৩৬০° | অমাবস্যা | ০°/৩৬০°—নতুন cycle |
পূর্ণিমা নামটি ১৮০°-এ শেষ হওয়া bright-fortnight tithi এবং অমাবস্যা ৩৬০°-এ শেষ হওয়া dark-fortnight tithi। Index mapping লিখতে array-এর ১৪ নম্বর slot-এ পূর্ণিমা, ২৯ নম্বর slot-এ অমাবস্যা রাখুন। শুধু (index % 15) + 1 দেখালে পক্ষ জানা গেলেও পূর্ণিমা/অমাবস্যার বিশেষ নাম হারিয়ে যেতে পারে।
নক্ষত্র: চন্দ্রের নিরয়ণ দ্রাঘিমার ২৭ ভাগ
Ecliptic-কে ২৭টি সমান ভাগ করলে প্রতিটি ভাগ ১৩°২০′। অশ্বিনী ০° থেকে শুরু ধরে:
NakshatraIndex = floor(N / (360° / 27))
নক্ষত্রে সূর্যের angle লাগে না; লাগে চন্দ্রের declared sidereal longitude। তাই ayanāṃśa/profile বদলালে nakshatra boundary বদলাতে পারে। Traditional engine যদি নিজস্ব nirayana frame দেয়, তার value-কে আবার Lahiri ayanāṃśa দিয়ে subtract করবেন না। Modern Swiss Ephemeris profile-এ যে sidereal mode ঘোষণা করা হয়েছে সেটিই consistently ব্যবহার করুন।
| Index | নক্ষত্র | Sidereal span |
|---|---|---|
| ০ | অশ্বিনী | ০°০০′–১৩°২০′ |
| ১ | ভরণী | ১৩°২০′–২৬°৪০′ |
| ২ | কৃত্তিকা | ২৬°৪০′–৪০°০০′ |
| ২৬ | রেবতী | ৩৪৬°৪০′–৩৬০°০০′ |
Abhijit-কে ritual interval হিসেবে কোনো বিশেষ rule-এ ব্যবহার করা হলেও সাধারণ ২৭-nakshatra Panchanga indexing-এর মাঝখানে ২৮তম equal segment ঢোকাবেন না। এমন rule থাকলে base 27-segment timeline-এর ওপর আলাদা derived interval হিসেবে রাখুন।
করণ: অর্ধতিথি, কিন্তু নামের ক্রম বিশেষ
এক করণ ৬° elongation, অর্থাৎ এক তিথির অর্ধাংশ। ৩৬০°-এ ৬০টি karana slot হলেও নাম ১১টি। চারটি স্থির এবং সাতটি চল করণ পুনরাবৃত্ত হয়।
HalfTithiIndex = floor(E / 6°) → 0 … 59
| Slot | করণের নিয়ম | নাম |
|---|---|---|
| ০ | প্রথম স্থির করণ | কিংস্তুঘ্ন |
| ১–৫৬ | সাতটি নাম আটবার cycle | বব, বালব, কৌলব, তৈতিল, গর, বণিজ, বিষ্টি |
| ৫৭ | শেষের স্থির করণ | শকুনি |
| ৫৮ | শেষের স্থির করণ | চতুষ্পাদ |
| ৫৯ | শেষের স্থির করণ | নাগ |
Common bug হলো halfIndex % 7 দিয়ে সব ৬০ slot map করা। এতে কিংস্তুঘ্ন এবং শেষ তিন স্থির করণ ভুল হয়। সঠিক mapping:
static readonly string[] MovableKarana =
{
"বব", "বালব", "কৌলব", "তৈতিল", "গর", "বণিজ", "বিষ্টি"
};
static string KaranaName(int halfIndex)
{
if (halfIndex == 0) return "কিংস্তুঘ্ন";
if (halfIndex >= 1 && halfIndex <= 56)
return MovableKarana[(halfIndex - 1) % 7];
if (halfIndex == 57) return "শকুনি";
if (halfIndex == 58) return "চতুষ্পাদ";
if (halfIndex == 59) return "নাগ";
throw new ArgumentOutOfRangeException("halfIndex");
}
যোগ: সূর্য ও চন্দ্রের দ্রাঘিমার যোগফল
যোগ নির্ণয়ে subtraction নয়, normalized sum ব্যবহৃত হয়। ৩৬০°-কে ২৭ ভাগ করে প্রতিটি segment ১৩°২০′:
YogaIndex = floor(Y / (360° / 27))
প্রথম segment বিষ্কম্ভ, তারপর প্রীতি, আয়ুষ্মান ইত্যাদি; ২৭তম বৈধৃতি। সূর্য ও চন্দ্রের longitude একই frame-এ হতে হবে। একটি tropical এবং অন্যটি sidereal হলে নাম ও boundary দুটোই অর্থহীন হয়ে যাবে।
যোগ phase দিনে চন্দ্রের motion-এর সঙ্গে সূর্যের motion-ও যোগ করে এগোয়। তাই nakshatra ও yoga উভয়ের segment width ১৩°২০′ হলেও ending time এক নয়। শুধু চন্দ্রের nakshatra end কপি করে yoga end বানানো যাবে না।
Current অঙ্গের শেষ থেকে next অঙ্গ
কোনো instant-এ phase P এবং segment width W হলে current index ও remaining angle:
nextBoundary = (index + 1) × W
remaining = nextBoundary − P
শেষ segment-এ nextBoundary = 360°; root-এর পরে phase ০°-এ wrap করে index ০ হয়। Current এবং next name array থেকে পাওয়া যায়:
int currentIndex = StateIndex(phase, width, count);
int nextIndex = (currentIndex + 1) % count;
string text = names[currentIndex]
+ " " + FormatEndingTime(boundaryLocal)
+ " পর্যন্ত পরে " + names[nextIndex];
Boundary instant-এ evaluation করলে নতুন state পাওয়া উচিত। তবে floating-point rounding-এ exact angle boundary-এর সামান্য নিচে দেখা যেতে পারে। তাই stored transition-এ solver-এর intended NextIndex রাখুন; display করার সময় boundary instant আবার divide করে name অনুমান করবেন না।
তিথি বা নক্ষত্রের সময়কাল সমান নয় কেন?
প্রতিটি segment-এর angular width সমান, কিন্তু সূর্য ও চন্দ্রের apparent motion সমান গতির নয়। বিশেষত চন্দ্রের orbital speed ক্রমাগত বদলায়। ফলে:
- এক তিথি fixed ২৪ ঘণ্টা নয়;
- এক নক্ষত্র fixed এক civil day নয়;
- দুই করণের সময়কাল একই নাও হতে পারে;
- নক্ষত্র ও যোগের width সমান হলেও তাদের phase speed আলাদা;
- এক Panchanga day-এ কোনো অঙ্গ না-ও বদলাতে পারে, আবার একাধিকবার বদলাতে পারে।
Average duration দিয়ে ending time বানানো তাই গ্রহণযোগ্য নয়। Average কেবল initial search estimate দিতে পারে; final instant অবশ্যই engine-এর actual longitude function-এর root থেকে আসবে।
৩৬০° wrap-এর নিরাপদ গণনা
সরাসরি moonLongitude - sunLongitude ব্যবহার করলে ৩৫৯° থেকে ০° crossing-এ negative value বা ৩৬০° jump দেখা যায়। সব phase normalize করুন:
static double NormalizeDegrees(double value)
{
value %= 360.0;
if (value < 0.0) value += 360.0;
return value;
}
static double ForwardDegrees(double from, double to)
{
return NormalizeDegrees(to - from);
}
Index calculation-এর আগে খুব ছোট numerical overflow সামলান। কোনো engine ৩৬০.০০০০০০০০০১ দিলে normalize করে ০ করতে হবে; আবার ৩৫৯.৯৯৯৯৯৯৯৯-কে অযথা ০ করবেন না। একটি documented angular tolerance ব্যবহার করুন এবং raw angle diagnostics-এ রাখুন।
Ending moment: bracket, তারপর refine
Reliable boundary solver-এর দুই ধাপ:
- Bracket: বর্তমান instant থেকে ছোট step-এ এগিয়ে target angular advance অতিক্রম করা পর্যন্ত search;
- Refine: bracket-এর মধ্যে bisection বা Brent method দিয়ে প্রয়োজনীয় time tolerance পর্যন্ত root সংকুচিত করা।
তিথি, নক্ষত্র, করণ ও যোগের phase সাধারণ daily interval-এ forward চলে; তবু solver-কে search horizon, iteration guard ও failure diagnostic দিতে হবে। Silent fallback হিসেবে “২৪ ঘণ্টা পরে” দেখানো বিপজ্জনক।
| Parameter | ব্যবহারিক সূচনা | মন্তব্য |
|---|---|---|
| Bracket step | ৩০–৬০ মিনিট | ৬° করণ boundary-ও নিরাপদে ধরা যায় |
| Search horizon | তিথি/নক্ষত্র/যোগ ৩ দিন; করণ ২ দিন | Failure হলে engine/profile inspect করুন |
| Time tolerance | ০.২৫–১ second | Display precision-এর চেয়ে সূক্ষ্ম রাখুন |
| Stored precision | Julian Day UT + UTC instant | Rounded display থেকে পুনর্গণনা নয় |
এক সূর্যোদয় থেকে পরের সূর্যোদয়: সব পরিবর্তন রাখুন
Sunrise-এ current state ও তার প্রথম ending time জানলেই daily report সম্পূর্ণ নাও হতে পারে। বিশেষ করে করণ প্রায়ই একই Panchanga day-এ দুবার বদলায়; ক্ষয় তিথির ক্ষেত্রে তিথিও একাধিক boundary অতিক্রম করতে পারে। তাই:
- Sunrise instant-এ current state নিন;
- তার next boundary solve করুন;
- Boundary next sunrise-এর আগে হলে event যোগ করুন;
- Next state থেকে আবার boundary খুঁজুন;
- Next sunrise বা guard limit-এ পৌঁছালে থামুন।
Boundary next sunrise-এর exact instant হলে বর্তমান daily record-এ নয়, next record-এ যাবে। আগের নিবন্ধে ব্যবহৃত half-open interval এই duplication বন্ধ করে। কোনো boundary না থাকলে তিথির project label “অহোরাত্র” হতে পারে; অন্য অঙ্গেও structured response-এ endsWithinWindow: false রাখা যায়।
C# 5/.NET Framework-compatible implementation
নিচের model-এ কোনো modern record, tuple বা init property নেই; তাই পুরোনো Web Forms/Desktop project-এ সহজে নেওয়া যায়:
public sealed class PanchangaAngles
{
public double SunLongitude { get; set; }
public double MoonLongitude { get; set; }
}
public sealed class AngaTransition
{
public string Anga { get; set; }
public int FromIndex { get; set; }
public int ToIndex { get; set; }
public string FromName { get; set; }
public string ToName { get; set; }
public double JulianDayUt { get; set; }
public DateTimeOffset LocalTime { get; set; }
}
public sealed class AngaDefinition
{
public string Name { get; set; }
public int Count { get; set; }
public double SegmentDegrees { get; set; }
public Func<PanchangaAngles, double> Phase { get; set; }
public Func<int, string> StateName { get; set; }
}
চার অঙ্গের definition:
AngaDefinition tithi = new AngaDefinition
{
Name = "তিথি",
Count = 30,
SegmentDegrees = 12.0,
Phase = a => NormalizeDegrees(a.MoonLongitude - a.SunLongitude),
StateName = i => TithiNames[i]
};
AngaDefinition nakshatra = new AngaDefinition
{
Name = "নক্ষত্র",
Count = 27,
SegmentDegrees = 360.0 / 27.0,
Phase = a => NormalizeDegrees(a.MoonLongitude),
StateName = i => NakshatraNames[i]
};
AngaDefinition karana = new AngaDefinition
{
Name = "করণ",
Count = 60,
SegmentDegrees = 6.0,
Phase = a => NormalizeDegrees(a.MoonLongitude - a.SunLongitude),
StateName = KaranaName
};
AngaDefinition yoga = new AngaDefinition
{
Name = "যোগ",
Count = 27,
SegmentDegrees = 360.0 / 27.0,
Phase = a => NormalizeDegrees(a.MoonLongitude + a.SunLongitude),
StateName = i => YogaNames[i]
};
একটি compact bracket-and-bisection solver:
double FindNextBoundary(
double startJdUt,
AngaDefinition anga,
Func<double, PanchangaAngles> positions,
double stepDays,
double maxDays)
{
double phase0 = anga.Phase(positions(startJdUt));
double inside = phase0 % anga.SegmentDegrees;
double needed = anga.SegmentDegrees - inside;
// At an exact boundary, seek the end of the newly-started segment.
if (needed < 1e-10) needed = anga.SegmentDegrees;
Func<double, double> f = delegate(double jd)
{
double phase = anga.Phase(positions(jd));
return ForwardDegrees(phase0, phase) - needed;
};
double left = startJdUt;
double right = left + stepDays;
double limit = startJdUt + maxDays;
while (right <= limit && f(right) < 0.0)
{
left = right;
right += stepDays;
}
if (right > limit)
throw new InvalidOperationException(
anga.Name + "-এর পরবর্তী boundary পাওয়া যায়নি।");
for (int i = 0; i < 60; i++)
{
double mid = (left + right) * 0.5;
if (f(mid) < 0.0) left = mid;
else right = mid;
}
return (left + right) * 0.5;
}
stepDays = 1.0 / 24.0 অর্থ এক ঘণ্টা। Production code-এ engine call cache, ephemeris error propagation এবং cancellation support যোগ করুন। Search interval দুই দিনের কম হওয়ায় ForwardDegrees এক পূর্ণ cycle wrap করার ঝুঁকি নেই; generic long-range solver-এ continuous unwrapped phase ব্যবহার করুন।
Daily scanner:
List<AngaTransition> ScanAnga(
DateTimeOffset sunrise,
DateTimeOffset nextSunrise,
AngaDefinition anga,
Func<double, PanchangaAngles> positions)
{
var result = new List<AngaTransition>();
double cursor = ToJulianDayUt(sunrise);
double end = ToJulianDayUt(nextSunrise);
for (int guard = 0; guard < 8; guard++)
{
double phase = anga.Phase(positions(cursor));
int from = (int)Math.Floor(phase / anga.SegmentDegrees);
if (from >= anga.Count) from = 0;
double boundary = FindNextBoundary(
cursor, anga, positions, 1.0 / 24.0, 3.0);
if (boundary >= end) break;
int to = (from + 1) % anga.Count;
result.Add(new AngaTransition
{
Anga = anga.Name,
FromIndex = from,
ToIndex = to,
FromName = anga.StateName(from),
ToName = anga.StateName(to),
JulianDayUt = boundary,
LocalTime = FromJulianDayUt(boundary)
});
cursor = boundary + (0.5 / 86400.0); // half-second progress
}
return result;
}
শেষ line-এর half-second progress solver-এর tolerance-এর চেয়ে বড় এবং display precision-এর তুলনায় ছোট। আরও পরিষ্কার architecture-এ FindNextBoundary-কে expected next state দিন, যাতে artificial time shift-এর দরকার না হয়। Guard শেষ হলে silent partial result নয়—diagnostic throw করুন।
বাংলা clock time, নিশা এবং দণ্ড-পল-বিপল
Astronomical instant একবার নির্ণীত হলে presentation layer একাধিক রূপ দিতে পারে:
| রূপ | উদাহরণ | ভিত্তি |
|---|---|---|
| Local clock | রাত্র ঘ ১০:১৪:৫০ | Selected timezone |
| Post-midnight | নিশা ঘ ২:৫৯:১২ | Same sunrise-window, next civil date |
| দণ্ড-পল-বিপল | দং ৪০/৪৬/১৬.৬২ | Sunrise থেকে elapsed traditional time |
| ISO/API | 2026-10-09T02:59:12+05:30 | Date, time ও offset |
এক solar day-কে conventionally ৬০ দণ্ড, এক দণ্ডকে ৬০ পল এবং এক পলকে ৬০ বিপল ধরা হয়। Modern fixed conversion-এ ১ দণ্ড = ২৪ মিনিট, ১ পল = ২৪ second, ১ বিপল = ০.৪ second। Project-এর printed format sunrise-relative হলে:
double elapsedSeconds = (eventLocal - sunriseLocal).TotalSeconds;
double totalDanda = elapsedSeconds / (24.0 * 60.0);
int danda = (int)Math.Floor(totalDanda);
double totalPala = (totalDanda - danda) * 60.0;
int pala = (int)Math.Floor(totalPala);
double bipala = (totalPala - pala) * 60.0;
Clock string থেকে দণ্ড হিসাব করবেন না; actual instants subtract করুন। DST transition, historical offset বা midnight crossing-এ string arithmetic ভুল ফল দেয়। কোন convention—fixed ২৪-minute daṇḍa, নাকি actual sunrise-to-next-sunrise-কে ৬০ ভাগ—ব্যবহার করছেন তা metadata-তে ঘোষণা করুন; দুই পদ্ধতি মেশাবেন না।
Traditional Surya Siddhanta ও Drik ফল আলাদা রাখুন
এই boundary algorithm উভয় profile-এ ব্যবহার করা যায়, কিন্তু position provider আলাদা:
| Profile | সূর্য/চন্দ্র longitude | Expected use |
|---|---|---|
| Traditional Surya Siddhanta | Traditional mean/true corrections ও declared bīja | ঐতিহ্যিক printed Panjika fit |
| Drik/Lahiri | Modern ephemeris + declared sidereal mode | Observational/modern astronomical profile |
Saṅkrānti ও Bengali-date matching-এর জন্য project-এর আলাদা modern-fit star correction থাকলেও তা তিথি, নক্ষত্র, করণ, যোগ বা planetary positions-এ অনিচ্ছাকৃতভাবে প্রয়োগ করা যাবে না। প্রতিটি result-এ calculationProfileId, bīja status, ayanāṃśa এবং ephemeris version রাখলে ভিন্ন পদ্ধতির ফল গুলিয়ে যায় না।
Validation checklist
- Angle normalize সবসময় ০° ≤ value < ৩৬০°;
- ৩৫৯.৯৯° থেকে ০.০১° crossing forward হিসেবে ধরা হয়;
- তিথি প্রতি ১২°, করণ প্রতি ৬°;
- নক্ষত্র ও যোগের width exact
360/27; - শুক্ল/কৃষ্ণ পক্ষ index ০–২৯ সঠিক;
- পূর্ণিমা ও অমাবস্যার বিশেষ নাম ঠিক;
- করণ slot ০ কিংস্তুঘ্ন;
- করণ slot ১–৫৬ সাত নামের cycle;
- করণ slot ৫৭–৫৯ শকুনি, চতুষ্পাদ, নাগ;
- রেবতী → অশ্বিনী wrap;
- বৈধৃতি → বিষ্কম্ভ wrap;
- অমাবস্যা → শুক্ল প্রতিপদ wrap;
- Exact boundary instant নতুন state-এর;
- Root-এর এক second আগে পুরোনো state;
- Root-এর এক second পরে নতুন state;
- এক day-এ দুই করণ transition হারায় না;
- ক্ষয় তিথির একাধিক transition হারায় না;
- Next sunrise exact boundary next record-এর;
- Post-midnight event “নিশা” এবং full ISO date পায়;
- No-boundary tithi project rule অনুযায়ী “অহোরাত্র”;
- Dhaka, Kolkata ও New York-এ একই UTC root-এর local time ঠিক;
- DST day-এ fixed ২৪-hour assumption নেই;
- Traditional ও Drik result পৃথক cache key ব্যবহার করে;
- Displayed next name stored
ToIndexথেকে আসে; - Solver failure diagnostic-এ anga, JD, angles ও profile আছে;
- Daily HTML, API ও XML একই transition IDs ব্যবহার করে।
উপসংহার
তিথি, নক্ষত্র, করণ ও যোগের পাশে লেখা সময় কোনো আনুমানিক দৈর্ঘ্য নয়; এটি একটি নির্দিষ্ট angular boundary অতিক্রমের মুহূর্ত। তিথি ও করণ সূর্য–চন্দ্রের elongation, নক্ষত্র চন্দ্রের sidereal longitude, আর যোগ সূর্য ও চন্দ্রের longitude sum থেকে আসে। তাই calculation pipeline হওয়া উচিত: position → normalized phase → current segment → next boundary root → local display।
“পর্যন্ত পরে…” output তৈরি করতে current name, ending instant এবং stored next name তিনটিই দরকার। Circular angle wrap, exact boundary ownership এবং numerical tolerance স্পষ্ট না হলে বিশেষত অমাবস্যা, রেবতী বা বৈধৃতি crossing-এ off-by-one error হবে। করণের স্থির ও চল নামের ক্রমও আলাদা করে map করতে হবে।
সবচেয়ে গুরুত্বপূর্ণ হলো প্রথম transition-এ থেমে না যাওয়া। Current sunrise inclusive থেকে next sunrise exclusive পর্যন্ত প্রতিটি boundary scan করলে ক্ষয় তিথি, একাধিক করণ এবং নিশার event হারায় না। একই structured timeline থেকে Daily Details, print report, API ও yearly XML render করলে চার জায়গায় চার রকম ফল হওয়ার ঝুঁকিও দূর হয়।
তথ্যসূত্র ও আরও পাঠ
- Positional Astronomy Centre, Kolkata—Rashtriya Panchang explanation; তিথি, নক্ষত্র, যোগ ও করণের পাশে প্রদত্ত সময় ending moment।
- Positional Astronomy Centre—Names of Tithis, Nakshatras, Yogas, Karanas and Rasis.
- Robert Sewell ও Śaṅkara Bālakṛṣṇa Dīkṣita—The Indian Calendar, 1896; তিথি ১২°, নক্ষত্র ও যোগ ১৩°২০′, করণ ৬°-এর সংজ্ঞা।
- M. Yano ও M. Fushimi—Pancanga 3.14 program notes; traditional calculation context.
- Astrodienst—Swiss Ephemeris Programmer’s Documentation; longitude, Julian Day, time scale ও ephemeris flags.
- Government of India—Report of the Calendar Reform Committee, 1955.
- সূর্য সিদ্ধান্ত পঞ্জিকা project; Traditional Fit, Drik profile, daily sunrise-window, API এবং XML output conventions.
মন্তব্য, আলোচনা ও প্রশ্ন