একই local date-এ sunrise-এর সময় দশমী, দুপুরে একাদশী এবং রাতে দ্বাদশী হতে পারে। Header-এ দেখানো sunrise-tithi সঠিক হলেও সেটি মধ্যাহ্ন-ব্যাপিনী বা নিশীথ-ব্যাপিনী উৎসবের সিদ্ধান্ত দিতে পারে না। নির্ভরযোগ্য পঞ্জিকা তাই প্রথমে ধারাবাহিক astronomical timeline তৈরি করে, পরে tradition-specific rule-moment-এ সেই timeline পরীক্ষা করে।
Civil date আর ritual rule-moment এক নয়
“৮ অক্টোবর উৎসব”—এটি গণনার input নয়; এটি rule প্রয়োগের পর পাওয়া display date। Calculation-এর input হলো:
- স্থানীয় latitude, longitude ও time zone;
- নির্বাচিত sunrise/sunset profile;
- তিথি ও নক্ষত্রের absolute start/end instants;
- উৎসবের rule profile বা পরম্পরা;
- প্রয়োজনীয় moment—sunrise, অরুণোদয়, মধ্যাহ্ন, প্রদোষ, নিশীথ ইত্যাদি;
- একাধিক দিনের মধ্যে নির্বাচন করার priority ও tie-break rule।
অতএব festival service-এর কাজ “আজকের তিথির নাম” মিলিয়ে label বসানো নয়। তাকে candidate local days তৈরি করে প্রত্যেক দিনের rule interval-এ তিথির overlap মাপতে হবে, তারপর declared rule অনুসারে সেরা দিন নিতে হবে।
একটি canonical solar day object
Daily report, Bengali calendar ও festival engine যেন আলাদা আলাদা sunrise calculate না করে। একটি shared SunDayResult থেকে চারটি মৌলিক instant নিন:
E = একই দিনের project sunset
N = পরবর্তী local date-এর project sunrise
A = S − ৯৬ absolute minutes
Daylight = [S, E)
Night = [E, N)
Panjika day = [S, N)
এখানে interval-এর notation [start, end): start অন্তর্ভুক্ত, end বাদ। ফলে কোনো তিথি যদি ঠিক interval-end-এ শুরু হয়, তাকে আগের interval-এর overlap বলা হবে না। Boundary case-এ double counting এড়াতে এই নিয়ম সব service-এ এক রাখুন।
আগের প্রবন্ধে নির্ধারিত project profile—Sun center, no refraction—এই চারটি instant-এর ভিত্তি। অন্য sunrise profile ব্যবহার করতে চাইলে আলাদা version ID এবং আলাদা cache key ব্যবহার করতে হবে।
Fixed duration ও proportional division গুলিয়ে ফেলবেন না
| Rule-time | এই project-এ নির্মাণ | প্রকৃতি |
|---|---|---|
| অরুণোদয় | Project sunrise-এর ৯৬ মিনিট আগে | Fixed absolute duration |
| দিনের ১ মুহূর্ত | (sunset − sunrise) ÷ ১৫ | Proportional daylight division |
| রাত্রির ১ মুহূর্ত | (next sunrise − sunset) ÷ ১৫ | Proportional night division |
| মধ্যাহ্ন | দিনের তৃতীয় পঞ্চমাংশ | Proportional interval |
| নিশীথ | রাত্রির অষ্টম মুহূর্ত | Proportional interval |
| প্রদোষ | নির্বাচিত tradition/profile অনুযায়ী | Versioned policy |
দিন-রাত ঠিক ১২ ঘণ্টা হলে proportional মুহূর্ত ৪৮ মিনিট হয়। কিন্তু শীত-গ্রীষ্ম বা উচ্চ latitude-এ daylight ও night length বদলে যায়; তাই মধ্যাহ্ন বা নিশীথের জন্য সবদিন fixed ৪৮ মিনিট hard-code করা যুক্তিসঙ্গত নয়। অন্যদিকে project-এর অরুণোদয় rule ইচ্ছাকৃতভাবেই fixed চার দণ্ড বা ৯৬ মিনিট।
সূর্যোদয় থেকে সূর্যাস্ত: দিনের পাঁচ ভাগ
Ritual day-কে পাঁচ সমান অংশে ভাগ করলে:
| ক্রম | নাম | Daylight fraction | দিনের মুহূর্ত |
|---|---|---|---|
| ১ | প্রাতঃ (Prātaḥ) | [০/৫, ১/৫) | ১–৩ |
| ২ | সঙ্গব (Saṅgava) | [১/৫, ২/৫) | ৪–৬ |
| ৩ | মধ্যাহ্ন (Madhyāhna) | [২/৫, ৩/৫) | ৭–৯ |
| ৪ | অপরাহ্ণ (Aparāhna) | [৩/৫, ৪/৫) | ১০–১২ |
| ৫ | সায়াহ্ন (Sāyāhna) | [৪/৫, ৫/৫) | ১৩–১৫ |
PartLength = DayLength ÷ ৫
Part(i).Start = Sunrise + DayLength × i/৫
Part(i).End = Sunrise + DayLength × (i+১)/৫
এই interval-গুলো clock-এর স্থির ৬:০০–৮:২৪ বা ১১:০০–১৩:০০ নয়। Dhaka, Kolkata ও New York-এ একই তারিখে এবং একই time zone-এর ভিন্ন longitude-এও সূর্যোদয়-সূর্যাস্তের কারণে boundary বদলাবে।
মধ্যাহ্ন: শুধু clock noon নয়
মধ্যাহ্ন হলো daylight-এর তৃতীয় পঞ্চমাংশ:
Madhyahna.End = AtFraction(Sunrise, Sunset, ৩/৫)
Madhyahna.Midpoint = AtFraction(Sunrise, Sunset, ১/২)
এটি civil clock-এর ১২টা নয়। Daylight midpoint apparent solar noon-এর কাছাকাছি হলেও একই জিনিস বলে ধরে নেওয়া উচিত নয়; actual solar transit চাইলে ephemeris transit function দিয়ে আলাদাভাবে solve করতে হবে। Festival policy যদি “মধ্যাহ্ন-ব্যাপিনী তিথি” বলে, তবে পুরো Madhyahna interval-এর সঙ্গে তিথির overlap পরীক্ষা করুন। যদি source “মধ্যাহ্ন-মুহূর্তে তিথি” বোঝায়, তবে midpoint-state পরীক্ষা হতে পারে। এই দুটো predicate একই নয়।
উদাহরণ: রামনবমী rule profile-এ নবমী দুই candidate দিনের মধ্যাহ্ন স্পর্শ করলে কোন দিনের overlap বেশি, পরের তিথি কোন সময় শুরু হয় এবং tradition-এর tie-break কী—সবগুলো declared হতে হবে। শুধু sunrise-এ নবমী দেখে সিদ্ধান্ত নিলে মধ্যাহ্ন-ব্যাপ্তির তথ্য হারায়।
অরুণোদয়: একটি fixed evaluation instant
এই project-এর বৈষ্ণব rule profile-এ অরুণোদয় selected project sunrise-এর ঠিক ৯৬ মিনিট আগে:
৪ দণ্ড = ৯৬ মিনিট
Arunodaya = ProjectSunrise − ৯৬ মিনিট
এটি civil dawn বা Sun altitude −৬° হওয়ার astronomical event নয়। একাদশী rule-এ প্রশ্ন হতে পারে—অরুণোদয়ে একাদশী ইতিমধ্যে শুরু হয়েছে, নাকি দশমী তখনও চলছে? তাই sunrise header-এর তিথি যথেষ্ট নয়; StateAt(arunodaya) আলাদাভাবে করতে হবে।
Smārta, Vaiṣṇava, Nimbārka বা অন্য পরম্পরার পূর্ণ একাদশী সিদ্ধান্তে sunrise, অরুণোদয়, তিথিক্ষয়/বৃদ্ধি, দ্বাদশী ও pāraṇa window-র আরও শর্ত থাকে। অরুণোদয় একটি input moment—একাই সম্পূর্ণ একাদশী algorithm নয়।
প্রদোষ: একটি universal hard-coded interval নয়
প্রদোষের সংজ্ঞা বিভিন্ন গ্রন্থ, অঞ্চল ও ব্যবহারিক tradition-এ একরকমভাবে প্রকাশিত হয় না। একটি rule source সূর্যাস্তের পর তিন মুহূর্তকে প্রদোষ বলে; অন্য ব্যাখ্যায় রাত্রির প্রথম পঞ্চমাংশ, ছয় ঘটিকা বা অন্য sunset-centered interval ব্যবহৃত হতে পারে। তাই engine-এ PradoshaPolicy বাধ্যতামূলক হওয়া উচিত।
public sealed class PradoshaPolicy
{
public string Id { get; set; }
public string Authority { get; set; }
public PradoshaMode Mode { get; set; }
public int NightMuhurtaCount { get; set; }
public int FixedMinutesAfterSunset { get; set; }
}
public enum PradoshaMode
{
ProportionalNightMuhurtas,
ProportionalFirstNightFifth,
FixedMinutesAfterSunset
}
ধর্মসিন্ধু-ভিত্তিক একটি illustrative profile:
NightMuhurta = (NextSunrise − Sunset) ÷ ১৫
Pradosha = [Sunset, Sunset + ৩ × NightMuhurta)
এটি example profile, সব tradition-এর জন্য universal ঘোষণা নয়। Printed Panjika যদি fixed ছয় ঘটিকা ব্যবহার করে, তার জন্য আলাদা policy ID দিন; পুরোনো profile-এর meaning বদলে দেবেন না। প্রদোষব্রতের candidate day নির্বাচন করতে Trayodaśī interval-এর সঙ্গে দুই দিনের configured Pradosha overlap তুলনা করতে হতে পারে।
নিশীথ: local night-এর অষ্টম মুহূর্ত
সূর্যাস্ত থেকে পরবর্তী সূর্যোদয় পর্যন্ত রাত্রিকে ১৫ সমান মুহূর্তে ভাগ করলে অষ্টম মুহূর্তটি রাতের মধ্যভাগে থাকে:
NightMuhurta = NightLength ÷ ১৫
Nishitha.Start = Sunset + ৭ × NightMuhurta
Nishitha.End = Sunset + ৮ × NightMuhurta
SolarNightMidpoint = (Sunset + NextSunrise) ÷ ২
Zero-based fraction-এ Nishitha হলো [7/15, 8/15) night interval। এর midpoint সূর্যাস্ত ও পরবর্তী সূর্যোদয়ের ঠিক মাঝখানে। এটি civil midnight 12:00 AM নয় এবং time-zone meridian, longitude ও ঋতু অনুযায়ী clock time বদলায়।
Janmāṣṭamī profile-এ Kṛṣṇa Aṣṭamī নিশীথ স্পর্শ করছে কি না, এবং কোনো tradition-এ Rohiṇī nakṣatra-ও একই interval-এ বা midpoint-এ উপস্থিত কি না—এগুলো পৃথক predicate। Mahāśivarātri বা night-pūjā rule-এও Nishitha প্রাসঙ্গিক হতে পারে, কিন্তু উৎসবভেদে tie-break এক নয়।
তিথি-ব্যাপ্তি: উপস্থিতি শুধু true/false নয়
ধরা যাক rule interval R এবং তিথির interval T। তাদের overlap:
OverlapEnd = min(R.End, T.End)
Overlap = max(০, OverlapEnd − OverlapStart)
Coverage = Overlap ÷ (R.End − R.Start)
Rule source-এর ভাষা অনুযায়ী বিভিন্ন predicate লাগতে পারে:
| Predicate | অর্থ | Typical calculation |
|---|---|---|
AtStart | Interval শুরুতে তিথি | T.Contains(R.Start) |
AtMidpoint | মধ্যবিন্দুতে তিথি | T.Contains(R.Midpoint) |
AnyOverlap | এক মুহূর্ত হলেও স্পর্শ | Overlap > 0 |
FullCoverage | পুরো rule interval জুড়ে তিথি | Coverage == 1 |
MajorityOverlap | অর্ধেকের বেশি ব্যাপ্তি | Coverage > 0.5 |
MaxOverlap | Candidate দিনের মধ্যে সর্বাধিক | Duration comparison + tie-break |
AnyOverlap আর AtMidpoint এক নয়। Aṣṭamī Nishitha-এর প্রথম পাঁচ মিনিটে শেষ হলে interval স্পর্শ করেছে, কিন্তু midpoint-এ নেই। কোনটিকে উৎসবের জন্য গ্রহণ করা হবে তা ঐতিহ্যগত rule নির্ধারণ করবে—programmer-এর অনুমান নয়।
উৎসবভেদে rule-moment-এর উদাহরণ
| Observance | Primary moment/window | Engine-এ পরীক্ষার ধরন |
|---|---|---|
| একাদশী | Sunrise ও অরুণোদয় | তিথি state, দশমী-স্পর্শ, ক্ষয়/বৃদ্ধি, school rule |
| রামনবমী | মধ্যাহ্ন | নবমীর vyāpti ও candidate-day comparison |
| প্রদোষব্রত | Configured প্রদোষ interval | ত্রয়োদশীর overlap, duration ও tie-break |
| জন্মাষ্টমী | নিশীথ | অষ্টমী, প্রয়োজনে রোহিণী, tradition priority |
| রাত্রিকালীন অমাবস্যা/পূর্ণিমা পূজা | Declared night interval | তিথির night-vyāpti |
| একাদশী পারণ | পরদিন sunrise-পরবর্তী window | দ্বাদশী, Hari-vāsara ও allowed daytime part |
এই table conceptual—প্রতিটি observance-এর পূর্ণ সিদ্ধান্তে আরও lunar month, pakṣa, weekday, nakṣatra, saṅkrānti বা regional condition থাকতে পারে। তাই একটি generic “festival by tithi” function-এর বদলে composable rules এবং উৎসব-নির্দিষ্ট policy ব্যবহার করা ভালো।
C# 5/.NET Framework-compatible interval engine
প্রথমে instant ও interval-কে absolute time-এ compare করুন:
public sealed class RuleInterval
{
public string Id { get; set; }
public DateTimeOffset Start { get; set; }
public DateTimeOffset End { get; set; }
public DateTimeOffset Midpoint
{
get { return RuleMath.AtFraction(Start, End, 1, 2, null); }
}
public bool Contains(DateTimeOffset instant)
{
DateTime utc = instant.UtcDateTime;
return utc >= Start.UtcDateTime && utc < End.UtcDateTime;
}
}
public enum PresenceRequirement
{
AtStart,
AtMidpoint,
AnyOverlap,
FullCoverage,
MajorityOverlap
}
Fraction helper local wall-clock ticks নয়, UTC span ভাগ করবে:
public static class RuleMath
{
public static DateTimeOffset AtFraction(
DateTimeOffset start,
DateTimeOffset end,
int numerator,
int denominator,
TimeZoneInfo zone)
{
if (denominator <= 0) throw new ArgumentOutOfRangeException("denominator");
if (numerator < 0 || numerator > denominator)
throw new ArgumentOutOfRangeException("numerator");
DateTimeOffset startUtc = start.ToUniversalTime();
DateTimeOffset endUtc = end.ToUniversalTime();
if (endUtc <= startUtc) throw new ArgumentException("end must follow start");
long spanTicks = (endUtc - startUtc).Ticks;
long partTicks = (long)Math.Round(
spanTicks * ((double)numerator / denominator),
MidpointRounding.AwayFromZero);
DateTimeOffset valueUtc = startUtc.AddTicks(partTicks);
return zone == null ? valueUtc : TimeZoneInfo.ConvertTime(valueUtc, zone);
}
public static TimeSpan Overlap(RuleInterval a, RuleInterval b)
{
DateTime start = a.Start.UtcDateTime > b.Start.UtcDateTime
? a.Start.UtcDateTime : b.Start.UtcDateTime;
DateTime end = a.End.UtcDateTime < b.End.UtcDateTime
? a.End.UtcDateTime : b.End.UtcDateTime;
return end > start ? end - start : TimeSpan.Zero;
}
}
Canonical day থেকে rule intervals:
public static RuleInterval BuildMadhyahna(
SunDayResult sun, TimeZoneInfo zone)
{
return new RuleInterval
{
Id = "madhyahna-day-third-fifth-v1",
Start = RuleMath.AtFraction(sun.Sunrise, sun.Sunset, 2, 5, zone),
End = RuleMath.AtFraction(sun.Sunrise, sun.Sunset, 3, 5, zone)
};
}
public static RuleInterval BuildNishitha(
SunDayResult sun, TimeZoneInfo zone)
{
return new RuleInterval
{
Id = "nishitha-night-eighth-muhurta-v1",
Start = RuleMath.AtFraction(sun.Sunset, sun.NextSunrise, 7, 15, zone),
End = RuleMath.AtFraction(sun.Sunset, sun.NextSunrise, 8, 15, zone)
};
}
Midpoint property-তে zone null হলে UTC instant ফেরে; display-এর সময় selected zone-এ convert করুন। Business rule-এ formatted time string compare করবেন না।
Presence evaluator:
public static bool IsPresent(
RuleInterval stateInterval,
RuleInterval ruleInterval,
PresenceRequirement requirement)
{
TimeSpan overlap = RuleMath.Overlap(stateInterval, ruleInterval);
TimeSpan ruleLength = ruleInterval.End.UtcDateTime
- ruleInterval.Start.UtcDateTime;
switch (requirement)
{
case PresenceRequirement.AtStart:
return stateInterval.Contains(ruleInterval.Start);
case PresenceRequirement.AtMidpoint:
return stateInterval.Contains(ruleInterval.Midpoint);
case PresenceRequirement.AnyOverlap:
return overlap > TimeSpan.Zero;
case PresenceRequirement.FullCoverage:
return overlap == ruleLength;
case PresenceRequirement.MajorityOverlap:
return overlap.Ticks * 2L > ruleLength.Ticks;
default:
throw new ArgumentOutOfRangeException("requirement");
}
}
তিথির timeline থেকে একটি RuleInterval বানাতে start ও end transition instants লাগবে। Daily display-তে শুধু “একাদশী রাত ১০:১৪ পর্যন্ত” string থাকলে overlap calculation করা যাবে না; raw instants model-এ রাখুন, string কেবল renderer বানাবে।
প্রতিটি সিদ্ধান্ত ব্যাখ্যাযোগ্য করুন
একটি festival result-এ শুধু নাম ও তারিখ নয়, rule trace থাকা উচিত:
festivalIdও displayed observance name;ruleProfileId, school/tradition ও source note;- candidate local dates;
- sunrise, sunset, next sunrise ও rule interval;
- তিথি/নক্ষত্রের start ও end instants;
- overlap seconds, coverage ratio ও applied predicate;
- tie-break rule এবং selected candidate;
- engine, ephemeris ও time-zone-data version।
উদাহরণস্বরূপ user-facing ব্যাখ্যা:
“এই দিনের প্রদোষ interval ১৭:২৮–১৯:৫৩। ত্রয়োদশী ১৮:১০ থেকে interval-এর ১০৩ মিনিট ব্যাপ্ত ছিল; পরের দিনের overlap ৪১ মিনিট। MaxOverlap ও profile tie-break অনুসারে প্রথম দিন নির্বাচিত।”
এমন trace printed Panjika-এর সঙ্গে mismatch গবেষণায় অমূল্য। Result আলাদা হলে প্রথমে গ্রহগণনা নয়—sunrise profile, interval definition, tithi boundary এবং tradition policy তুলনা করা যায়।
DST, high latitude ও boundary cases
- DST: Fraction ও duration UTC instant-এ গণনা করুন; শেষে local time-এ format করুন।
- Next sunrise: বর্তমান sunrise + ২৪ ঘণ্টা নয়; পরের local date-এর sunrise পুনর্গণিত হবে।
- Exact boundary: Half-open
[start, end)ব্যবহার করুন। - No rise/no set: Polar day/night-এ interval বানাবেন না; documented fallback profile না থাকলে status ফেরান।
- Ambiguous local time: Local string থেকে instant reconstruct না করে original
DateTimeOffsetরাখুন। - Skipped local time: Time-zone transition day-এ wall-clock subtraction এড়িয়ে UTC arithmetic করুন।
- Very small overlap: Tradition যদি “স্পর্শমাত্র” গ্রহণ করে
AnyOverlap; software নিজে arbitrary ১-মিনিট tolerance যোগ করবে না। - Numerical tolerance: Root solver-এর precision tolerance ও religious rule tolerance আলাদা রাখুন এবং trace-এ প্রকাশ করুন।
API ও XML-এ rule interval প্রকাশ
{
"festival": "janmashtami",
"localDate": "2026-09-04",
"ruleProfileId": "janmashtami-local-nishitha-v1",
"solarProfileId": "sun-center-no-refraction-v1",
"ruleInterval": {
"id": "nishitha-night-eighth-muhurta-v1",
"start": "...ISO local time...",
"end": "...ISO local time...",
"midpoint": "...ISO local time..."
},
"tests": [
{
"state": "krishna-ashtami",
"requirement": "AnyOverlap",
"overlapSeconds": 0,
"passed": false
}
],
"selected": false
}
উপরের values schema বোঝানোর জন্য illustrative। XML:
<festival-rule-trace festival="pradosha-vrata"
profile="dharmasindhu-3-night-muhurta-v1"
selected-date="...">
<solar-day profile="sun-center-no-refraction-v1">
<sunset>...</sunset>
<next-sunrise>...</next-sunrise>
</solar-day>
<rule-interval start="..." end="..." end-exclusive="true" />
<tithi name="trayodashi" start="..." end="..." />
<evaluation requirement="MaxOverlap"
overlap-seconds="..." coverage="..." passed="true" />
</festival-rule-trace>
Public API-তে compact result দিতে পারেন, কিন্তু research/debug mode-এ পূর্ণ trace রাখুন। Cache key-তে location, time zone, solar profile, festival rule profile এবং engine version অন্তর্ভুক্ত করুন।
Validation checklist
- Sunrise, sunset ও next sunrise একই solar profile থেকে এসেছে;
- Next sunrise পরের local date থেকে solve করা হয়েছে;
- Aruṇodaya exactly ৯৬ absolute minutes before sunrise;
- Aruṇodaya-কে twilight angle ধরে গণনা করা হয়নি;
- Daylight পাঁচ সমান proportional ভাগে বিভক্ত;
- Madhyahna fraction ঠিক [২/৫, ৩/৫);
- Night ১৫ proportional মুহূর্তে বিভক্ত;
- Nishitha fraction ঠিক [৭/১৫, ৮/১৫);
- Nishitha midpoint sunset ও next sunrise-এর midpoint;
- Civil 12:00 AM-কে Nishitha hard-code করা নেই;
- PradoshaPolicy ID ও authority সংরক্ষিত;
- একাধিক Pradosha convention একই constant-এ মিশে যায়নি;
- সব interval half-open
[start, end); - Exact end boundary double-count হয় না;
AnyOverlap,AtMidpointওFullCoverageপৃথক test;- Overlap zero হলে coverage zero;
- Candidate-day overlap durations trace-এ আছে;
- Tie-break deterministic ও documented;
- Tithi/nakṣatra raw instants string formatting-এর আগে সংরক্ষিত;
- DST spring-forward day test করা হয়েছে;
- DST fall-back day test করা হয়েছে;
- Dhaka, Kolkata ও New York regression cases আছে;
- Short winter day ও long summer day test আছে;
- No-rise/no-set condition fabricated time দেয় না;
- Festival rule profile cache key-তে আছে;
- Printed Panjika comparison-এ applied rule code দেখা যায়;
- API, HTML, print ও XML একই selected result ব্যবহার করে।
উপসংহার
উৎসবের তারিখ astronomical timeline ও ধর্মীয় rule—দুই স্তরের ফল। সূর্যোদয়-তিথি daily header-এর জন্য গুরুত্বপূর্ণ, কিন্তু সব observance-এর জন্য যথেষ্ট নয়। অরুণোদয় একটি fixed ৯৬-minute instant; মধ্যাহ্ন actual daylight-এর তৃতীয় পঞ্চমাংশ; নিশীথ local night-এর অষ্টম মুহূর্ত; আর প্রদোষের operational definition tradition-specific policy হিসেবে রাখা উচিত।
Engine যদি raw তিথি-নক্ষত্র intervals-এর সঙ্গে rule interval-এর overlap মাপে, তবে AnyOverlap, AtMidpoint, FullCoverage বা MaxOverlap স্পষ্টভাবে প্রয়োগ করা যায়। এতে result শুধু “তারিখ” নয়—কোন মুহূর্ত, কতক্ষণ ব্যাপ্তি এবং কোন rule-এর কারণে সেই তারিখ নির্বাচিত হলো তার audit trail-সহ প্রকাশিত হয়।
এই পদ্ধতি historical printed Panjika যাচাই, বহু-location calculation এবং ভবিষ্যৎ Assamese বা অন্য ভাষার display—সবক্ষেত্রেই একই calculation core ব্যবহার করতে দেয়। ভাষা বদলাবে renderer-এ; rule profile বদলাবে tradition selection-এ; কিন্তু astronomical instants অপরিবর্তিত থাকবে।
তথ্যসূত্র ও আরও পাঠ
- SriPedia—Sandhyāvandanam; sunrise-to-sunset day-এর পাঁচ ভাগ—প্রাতঃ, সঙ্গব, মধ্যাহ্ন, অপরাহ্ণ ও সায়াহ্ন।
- Shastra Panchangam—Pradosham; Dharmasindhu-ভিত্তিক তিন মুহূর্ত-পরবর্তী-sunset interval ও ত্রয়োদশী-ব্যাপ্তির selection rule।
- KaalPanchang—Nishita Kala; local sunset ও next sunrise-এর মধ্যে রাত্রির মধ্যবর্তী মুহূর্ত।
- PanchangTime—How Ekadashi Is Dated; sunrise, ৯৬-minute aruṇodaya, Dashami-viddha ও pāraṇa rule-এর explanatory treatment।
- Hindupedia—Pradoṣa; ছয় ঘটিকা এবং কিছু authority-তে তিন ঘটিকার ভিন্ন convention-এর উল্লেখ।
- সূর্য সিদ্ধান্ত পঞ্জিকা project specification; Sun center/no-refraction solar profile, UTC interval arithmetic, C# 5 compatibility এবং versioned observance policies.
মন্তব্য, আলোচনা ও প্রশ্ন