একটি app যদি “অরুণোদয় ৪:১৮ AM”, “ব্রাহ্মমুহূর্ত ৪:১৮–৫:০৬ AM” এবং “Astronomical dawn ৩:৫৪ AM” দেখায়, তিনটি আলাদা সময় হওয়াই স্বাভাবিক। প্রথম দুটি sunrise-relative ritual interval; তৃতীয়টি Sun-এর geometric altitude crossing। একই বাংলা শব্দে সবকিছুকে “ভোর” বলা গেলেও calculation key এক করা যাবে না।
তিনটি আলাদা time system
| System | Boundary | প্রধান ব্যবহার |
|---|---|---|
| অরুণোদয় | Chosen sunrise-এর ৪ দণ্ড আগে | বৈষ্ণব একাদশী ও প্রাতঃকৃত্য rule |
| ব্রাহ্মমুহূর্ত | Fixed অথবা seasonal night division | প্রাতঃসাধনা/ritual interval |
| Astronomical dawn | Sun center −১৮°, −১২°, −৬° crossing | Sky illumination ও twilight |
উষা, প্রভাত, dawn ও twilight ভাষায় overlap করতে পারে, কিন্তু software-এ exact meaning profile দিয়ে ঘোষণা করতে হবে।
দণ্ড, ঘটিকা, নাড়ী ও মুহূর্ত
Fixed traditional civil conversion:
১ দণ্ড/ঘটিকা = ২৪ মিনিট
১ মুহূর্ত = ২ দণ্ড = ৪৮ মিনিট
৪ দণ্ড = ২ মুহূর্ত = ৯৬ মিনিট
এটি equal clock-unit convention। Seasonal day/night division-এ daylight বা night length আলাদাভাবে ভাগ করলে unit duration ২৪/৪৮ মিনিট স্থির থাকে না। দুটি method mix করলে output self-contradictory হবে।
অরুণোদয়: এই project-এ ৪ দণ্ড আগে
Hari-bhakti-vilāsa-এর একাদশী-নির্ণয় অংশে অরুণোদয়কে sunrise-এর আগের চার ঘটিকা/দণ্ড বলা হয়েছে। Project rule:
= Sunrise − ৯৬ মিনিট
Arunodaya interval = [Sunrise − ৯৬ মিনিট, Sunrise)
উদাহরণ: chosen sunrise 05:54 হলে অরুণোদয় শুরু 04:18। Exact boundary-তে tithi evaluate করতে হলে unrounded instant ব্যবহার করুন; 04:18 display value থেকে reverse calculation নয়।
ব্রাহ্মমুহূর্তের fixed convention
Lexicographical/traditional description-এ ব্রাহ্মমুহূর্ত sunrise-এর চতুর্থ থেকে দ্বিতীয় ঘটিকার মধ্যবর্তী period—অর্থাৎ:
BrahmaMuhurtaEnd = Sunrise − ৪৮ মিনিট
Duration = ৪৮ মিনিট
এই convention-এ Brahma-muhūrta অরুণোদয়ের প্রথম অর্ধ। Sunrise 05:54 হলে:
অরুণোদয়: 04:18 → 05:54
ব্রাহ্মমুহূর্ত: 04:18 → 05:06
সূর্যোদয়ের পূর্ববর্তী শেষ মুহূর্ত: 05:06 → 05:54
কিছু জনপ্রিয় source “sunrise-এর ৪৮ মিনিট আগে” কথাটিকে Brahma-muhūrta শুরু বলে; অন্য source এটিকে period-এর end/last pre-sunrise muhurta-এর সঙ্গে মেশায়। তাই UI-তে শুধু একটি clock time নয়, start–end interval দেখানো উত্তম।
Fixed ৪৮ মিনিট বনাম seasonal night division
আরেক approach-এ previous sunset থেকে sunrise পর্যন্ত night interval ১৫ সমান muhurta-তে ভাগ করা হয়। Penultimate night muhurta:
NightMuhurta = Night ÷ ১৫
Start = Sunrise − ২ × NightMuhurta
End = Sunrise − ১ × NightMuhurta
Night ঠিক ১২ ঘণ্টা হলে প্রতিটি unit ৪৮ মিনিট এবং fixed method-এর সঙ্গে মিলে যায়। শীতের দীর্ঘ রাতে seasonal interval ৪৮ মিনিটের বেশি, গ্রীষ্মের ছোট রাতে কম।
| Method | প্রয়োজন | ফল |
|---|---|---|
fixed-48 | শুধু sunrise | সব ঋতুতে ৪৮ মিনিট |
seasonal-night-15 | Previous sunset + sunrise | Night length অনুযায়ী duration |
এই project-এর Ekādaśī Aruṇodaya rule fixed ৯৬ মিনিট। Brahma-muhūrta page-এ চাইলে fixed default এবং seasonal research option রাখা যায়; তাদের result key আলাদা হবে।
উষা, প্রভাত ও ভোর
Uṣā মূলত dawn-এর সাংস্কৃতিক/ঋগ্বৈদিক ধারণা; everyday বাংলা “উষা”, “প্রভাত”, “ভোর” strict mathematical boundary নয়। কোনো tradition নির্দিষ্ট rule না দিলে software-এ:
Ushaনামে invented exact minute দেবেন না;- astronomical/civil/nautical dawn-এর exact label ব্যবহার করুন;
- ritual Aruṇodaya আলাদা রাখুন;
- localized prose-এ “উষাকাল” ব্যবহার করলে underlying key দেখান।
উদাহরণ: “উষাকাল (civil dawn): 05:27”—এখানে parenthesis calculation definition পরিষ্কার করে।
Astronomical, nautical ও civil dawn
U.S. Naval Observatory-এর standard geometric thresholds:
| Dawn | Sun center altitude | সাধারণ অর্থ |
|---|---|---|
| Astronomical dawn | −১৮° rising crossing | Sun-scattered light starlight-কে ছাড়াতে শুরু |
| Nautical dawn | −১২° rising crossing | Horizon discernible; navigation context |
| Civil dawn | −৬° rising crossing | Outdoor activity-এর জন্য আলো বাড়তে শুরু |
| Sunrise | Selected limb/refraction profile | Solar disk horizon event |
Morning sequence সাধারণত:
Cloud, haze, Moonlight, terrain ও city light actual brightness বদলায়; thresholds conventional astronomical boundaries।
যে ধারণাগুলো সমার্থক নয়
| ভুল সমীকরণ | কেন ভুল |
|---|---|
| অরুণোদয় = astronomical dawn | একটি sunrise−৯৬ মিনিট; অন্যটি Sun altitude −১৮° |
| ব্রাহ্মমুহূর্ত = civil dawn | একটি ritual interval; অন্যটি −৬° crossing |
| উষা = একটি universal minute | সাংস্কৃতিক শব্দ; calculation policy দরকার |
| সূর্যোদয় = Sun center ০° সর্বত্র | Project/profile অনুযায়ী limb ও refraction বদলায় |
| ৪ দণ্ড = seasonal night-এর ১/১৫ × ২ | Fixed civil unit ও seasonal division আলাদা |
Sunrise profile বদলালে সব relative time সরে যায়
অরুণোদয় ও fixed Brahma-muhūrta chosen sunrise instant থেকে backward offset। তাই upper-limb/refraction sunrise যদি center/no-refraction sunrise-এর আগে হয়, তার Aruṇodaya-ও আগে হবে।
এই project-এর primary Panchanga sunrise profile hindu-center-geometric হলে Ekādaśī rule-এ একই profile ব্যবহার করুন। Public astronomical sunrise থেকে ৯৬ মিনিট বাদ দিয়ে এবং Panchanga sunrise অন্য profile রেখে hybrid result বানাবেন না।
Ekādaśī viddha rule-এ অরুণোদয়
Hari-bhakti-vilāsa চার দণ্ডের Aruṇodaya boundary-তে Daśamī contamination নিয়ে আলোচনা করে। এই project-এর computational policy:
- Chosen local sunrise exact UTC/JD-তে নির্ণয়;
- ৯৬ exact minutes বিয়োগ করে Aruṇodaya instant;
- সেই instant-এ geocentric tithi calculate;
- Daśamī থাকলে configured Vaiṣṇava viddha rule প্রয়োগ;
- school/authority key সহ decision trace সংরক্ষণ।
arunodayaInstantUtc = sunriseUtc.AddMinutes(-96.0);
tithiAtArunodaya = tithiEngine.Calculate(arunodayaInstantUtc);
// Festival policy layer:
isViddha = tithiAtArunodaya.Key == "dashami";
একটি rounded “04:18” string parse করে tithi পুনর্গণনা করবেন না। Root যদি 04:18:20 হয় এবং tithi 04:18:10-এ বদলে যায়, seconds হারালে decision উল্টো হতে পারে।
C# 5-compatible data model
public enum BrahmaMuhurtaMethod
{
FixedFortyEightMinutes,
SeasonalNightFifteenth
}
public sealed class DawnCalculationProfile
{
public string Key { get; set; }
public string Version { get; set; }
public double DandaMinutes { get; set; }
public int ArunodayaDandas { get; set; }
public BrahmaMuhurtaMethod BrahmaMethod { get; set; }
public int NightMuhurtaCount { get; set; }
public string SunriseProfileKey { get; set; }
}
public sealed class DawnPeriods
{
public DateTimeOffset PreviousSunsetUtc { get; set; }
public DateTimeOffset AstronomicalDawnUtc { get; set; }
public DateTimeOffset NauticalDawnUtc { get; set; }
public DateTimeOffset CivilDawnUtc { get; set; }
public DateTimeOffset ArunodayaStartUtc { get; set; }
public DateTimeOffset BrahmaStartUtc { get; set; }
public DateTimeOffset BrahmaEndUtc { get; set; }
public DateTimeOffset SunriseUtc { get; set; }
public string ProfileKey { get; set; }
public string ProfileVersion { get; set; }
}
Twilight না পাওয়া high-latitude case-এর জন্য production model-এ nullable field বা explicit EventStatus ব্যবহার করুন। এখানে readable core model দেখানো হয়েছে।
Fixed ৯৬/৪৮-minute calculation
static DawnCalculationProfile VaisnavaFixedProfile()
{
return new DawnCalculationProfile
{
Key = "vaisnava-arunodaya-fixed",
Version = "1.0",
DandaMinutes = 24.0,
ArunodayaDandas = 4,
BrahmaMethod =
BrahmaMuhurtaMethod.FixedFortyEightMinutes,
NightMuhurtaCount = 15,
SunriseProfileKey = "hindu-center-geometric"
};
}
static void ApplyFixedPeriods(
DawnPeriods result,
DawnCalculationProfile profile)
{
double arunodayaMinutes =
profile.ArunodayaDandas * profile.DandaMinutes;
double muhurtaMinutes = profile.DandaMinutes * 2.0;
result.ArunodayaStartUtc =
result.SunriseUtc.AddMinutes(-arunodayaMinutes);
result.BrahmaStartUtc =
result.SunriseUtc.AddMinutes(-2.0 * muhurtaMinutes);
result.BrahmaEndUtc =
result.SunriseUtc.AddMinutes(-1.0 * muhurtaMinutes);
}
Default values-এ Aruṇodaya start ও Brahma start একই instant। তবু দুটি property রাখুন—semantic meaning এবং future profile আলাদা।
Seasonal night-fifteenth calculation
static void ApplySeasonalBrahmaMuhurta(
DawnPeriods result,
DawnCalculationProfile profile)
{
if (result.PreviousSunsetUtc >= result.SunriseUtc)
throw new InvalidOperationException(
"Previous sunset must be before sunrise.");
if (profile.NightMuhurtaCount <= 0)
throw new ArgumentOutOfRangeException(
"NightMuhurtaCount");
TimeSpan night =
result.SunriseUtc - result.PreviousSunsetUtc;
TimeSpan oneNightMuhurta = TimeSpan.FromTicks(
night.Ticks / profile.NightMuhurtaCount);
result.BrahmaStartUtc =
result.SunriseUtc -
TimeSpan.FromTicks(oneNightMuhurta.Ticks * 2L);
result.BrahmaEndUtc =
result.SunriseUtc - oneNightMuhurta;
}
Previous sunset অবশ্যই sunrise-এর আগের local civil date-এর event। Current day sunset নিলে negative/invalid night হবে। DST transition থাকলেও absolute UTC duration ব্যবহার করায় calculation নিরাপদ।
Twilight boundary calculation
Swiss Ephemeris rise/set interface-এ twilight flags আছে:
static int TwilightMode(DawnKind kind)
{
int mode = SweConst.SE_CALC_RISE;
switch (kind)
{
case DawnKind.Civil:
return mode | SweConst.SE_BIT_CIVIL_TWILIGHT;
case DawnKind.Nautical:
return mode | SweConst.SE_BIT_NAUTIC_TWILIGHT;
case DawnKind.Astronomical:
return mode | SweConst.SE_BIT_ASTRO_TWILIGHT;
default:
throw new ArgumentOutOfRangeException("kind");
}
}
Standalone enum:
public enum DawnKind
{
Astronomical,
Nautical,
Civil
}
Custom solver হলে morning rising root:
static double TargetAltitude(DawnKind kind)
{
switch (kind)
{
case DawnKind.Astronomical: return -18.0;
case DawnKind.Nautical: return -12.0;
case DawnKind.Civil: return -6.0;
default: throw new ArgumentOutOfRangeException("kind");
}
}
Sunrise target-এর সঙ্গে twilight target mix করবেন না। Twilight Sun center-এর geometric altitude; Sunrise disc/refraction profile-এর event।
UTC subtraction, local display
৯৬ মিনিট local wall-clock text থেকে নয়, sunrise absolute instant থেকে বিয়োগ করুন:
DateTimeOffset arunodayaUtc =
sunriseUtc.ToUniversalTime().AddMinutes(-96.0);
DateTimeOffset arunodayaLocal =
TimeZoneInfo.ConvertTime(arunodayaUtc, zone);
DST spring/fall transition ভোরের কাছে ঘটলেও UTC arithmetic physical ৯৬ মিনিট বজায় রাখে। Local DateTime.AddMinutes(-96) ambiguous/invalid wall time বানাতে পারে।
Historical calculation
ঐতিহাসিক পঞ্জিকায়:
- Sunrise ও sunset internal JD/UT-তে রাখুন;
- অরুণোদয়ের জন্য ৯৬/১৪৪০ day বিয়োগ করা যায়;
- historical LMT/time-zone profile স্পষ্ট করুন;
- Julian/Gregorian label presentation layer-এ;
- festival decision trace-এ sunrise JD, Aruṇodaya JD ও tithi boundary JD রাখুন।
= SunriseJD − ১/১৫ day
JD arithmetic early year-এ .NET DateTime range এবং ১৫৮২ calendar reform gap এড়ায়।
High latitude-এ sunrise না হলে
Sunrise-relative Aruṇodaya-এর জন্য sunrise লাগবেই। Polar night/day-এ chosen date-এ sunrise না থাকলে:
ArunodayaStatus = "NoLocalSunrise";
BrahmaStatus = "NoLocalSunrise";
TwilightStatus = "CrossingNotFound";
Nearest sunrise নিয়ে ৯৬ মিনিট বাদ দিয়ে current day-এর অরুণোদয় বলবেন না। কোনো alternative high-latitude ritual convention নিলে authority, fallback latitude বা proportional rule প্রকাশ করুন।
API ও XML output
{
"date": "2026-10-09",
"location": "Dhaka",
"sunrise": "2026-10-09T05:54:00+06:00",
"sunriseProfile": "hindu-center-geometric",
"arunodaya": {
"start": "2026-10-09T04:18:00+06:00",
"end": "2026-10-09T05:54:00+06:00",
"rule": "four-dandas-before-sunrise",
"minutesBeforeSunrise": 96
},
"brahmaMuhurta": {
"start": "2026-10-09T04:18:00+06:00",
"end": "2026-10-09T05:06:00+06:00",
"method": "fixed-48"
},
"dawn": {
"astronomical": "2026-10-09T04:31:00+06:00",
"nautical": "2026-10-09T05:00:00+06:00",
"civil": "2026-10-09T05:29:00+06:00"
}
}
সময়গুলো format example; astronomical test vector নয়। XML:
<dawn-periods date="2026-10-09"
sunrise-profile="hindu-center-geometric">
<arunodaya start="2026-10-09T04:18:00+06:00"
end="2026-10-09T05:54:00+06:00"
rule="four-dandas" />
<brahma-muhurta start="2026-10-09T04:18:00+06:00"
end="2026-10-09T05:06:00+06:00"
method="fixed-48" />
<dawn astronomical="2026-10-09T04:31:00+06:00"
nautical="2026-10-09T05:00:00+06:00"
civil="2026-10-09T05:29:00+06:00" />
</dawn-periods>
সাধারণ implementation error
| ভুল | ফল | সংশোধন |
|---|---|---|
| অরুণোদয় = −১৮° dawn | ঋতুভেদে wrong interval | Sunrise−৯৬ মিনিট |
| ব্রাহ্মমুহূর্ত = sunrise−৪৮ থেকে sunrise | Interval one muhurta late | Fixed start −৯৬, end −৪৮ |
| ৪ দণ্ড = ৪৮ মিনিট | অর্ধেক সময় | ১ দণ্ড ২৪ মিনিট; ৪=৯৬ |
| Fixed ও seasonal mix | Untraceable output | Method key/version |
| Current sunset দিয়ে night | Negative interval | Previous local sunset |
| Local wall-clock subtraction | DST ambiguity | UTC instant arithmetic |
| Rounded display time-এ tithi | Boundary decision ভুল | Exact JD/UTC |
| Mixed sunrise profiles | Festival mismatch | One profile chain |
| উষা universal exact time | Invented definition | Underlying rule label |
| No sunrise-এ midnight fallback | Fabricated Aruṇodaya | Explicit no-result/policy |
Validation checklist
- ১ দণ্ড = ২৪ মিনিট;
- ১ মুহূর্ত = ৪৮ মিনিট;
- ৪ দণ্ড = ৯৬ মিনিট;
- Aruṇodaya start sunrise−৯৬;
- Aruṇodaya end exact sunrise;
- Fixed Brahma start sunrise−৯৬;
- Fixed Brahma end sunrise−৪৮;
- Fixed Brahma duration ৪৮ মিনিট;
- ১২-hour night-এ seasonal=fixed;
- Long winter night-এ seasonal duration >৪৮;
- Short summer night-এ seasonal duration <৪৮;
- Seasonal previous sunset ব্যবহার;
- Previous sunset < sunrise validation;
- NightMuhurtaCount=15;
- Astronomical dawn target −১৮°;
- Nautical dawn target −১২°;
- Civil dawn target −৬°;
- Dawn order −১৮ → −১২ → −৬;
- Twilight ≠ Aruṇodaya;
- Civil dawn ≠ Brahma-muhūrta;
- Uṣā label includes rule;
- Chosen sunrise profile inherited;
- Center/no-refraction regression;
- Upper-limb/refraction comparison;
- Profile change invalidates cache;
- Exact UTC subtraction;
- DST spring transition;
- DST fall transition;
- Dhaka regression;
- Kolkata regression;
- New York regression;
- Same sunrise instant gives exact ৯৬-minute offset;
- Rounded display does not feed calculation;
- Tithi boundary one second before Aruṇodaya;
- Tithi boundary exact Aruṇodaya;
- Tithi boundary one second after Aruṇodaya;
- Daśamī-at-Aruṇodaya viddha path;
- Ekādaśī-at-Aruṇodaya śuddha path;
- School/authority key in trace;
- Festival rule separate from astronomy;
- Historical JD subtraction ১/১৫ day;
- Julian/Gregorian same instant;
- Historical LMT profile;
- Polar no-sunrise status;
- No fabricated fallback;
- Twilight crossing-not-found status;
- HTML/API/XML same interval;
- Start–end displayed, not single time;
- Profile key/version exported;
- Regression against accepted Vaiṣṇava calendar।
উপসংহার
অরুণোদয়, ব্রাহ্মমুহূর্ত ও astronomical dawn একই “ভোর” অঞ্চলে হলেও calculation এক নয়। এই project-এর Vaiṣṇava Aruṇodaya হলো chosen sunrise-এর চার দণ্ড—৯৬ মিনিট—আগে থেকে sunrise পর্যন্ত। Fixed Brahma-muhūrta হলো sunrise-এর ৯৬ থেকে ৪৮ মিনিট আগে।
Seasonal research method previous sunset থেকে sunrise পর্যন্ত night-কে ১৫ ভাগ করে penultimate unit নেয়; night ১২ ঘণ্টা না হলে fixed method-এর সঙ্গে ফল মেলে না। Civil, nautical ও astronomical dawn আবার Sun center-এর −৬°, −১২° ও −১৮° crossings।
Exact sunrise UTC/JD থেকে interval তৈরি, profile key সংরক্ষণ, tithi exact Aruṇodaya instant-এ evaluate এবং local display পরে করলে Ekādaśī, Sandhyā page, Daily Details, API ও XML একই rule অনুসরণ করবে।
তথ্যসূত্র ও আরও পাঠ
- Hari-bhakti-vilāsa, Vilāsa 12; Ekādaśī determination, চার ঘটিকা/দণ্ড Aruṇodaya ও viddha discussion.
- U.S. Naval Observatory—Rise, Set and Twilight Definitions; civil −৬°, nautical −১২°, astronomical −১৮° thresholds.
- U.S. Naval Observatory—Astronomical Almanac Glossary; twilight terminology ও zenith distances.
- Sanskrit dictionary compilation—Brāhma-muhūrta; fourth-to-second ghaṭikā before sunrise definition.
- Swiss Ephemeris Programmer’s Documentation; civil, nautical ও astronomical twilight flags.
- Positional Astronomy Centre—Rashtriya Panchang Explanation; sunrise convention ও sunrise-to-sunrise daily framework.
- সূর্য সিদ্ধান্ত পঞ্জিকা project specification; ৯৬-minute Vaiṣṇava Aruṇodaya, Ekādaśī schools ও exact tithi-at-boundary rule.
মন্তব্য, আলোচনা ও প্রশ্ন