Printed Panchanga-তে “দং ৪০/৪৬/১৬.৬২ পর্যন্ত” দেখলে সেটি ৪০ ঘণ্টা নয়। অর্থ হলো chosen sunrise থেকে ৪০ দণ্ড, ৪৬ পল ও ১৬.৬২ বিপল elapsed time। Fixed conversion-এ এটি (৪০×২৪) মিনিট + (৪৬×২৪) সেকেন্ড + (১৬.৬২×০.৪) সেকেন্ড। Clock time এবং দণ্ড-পল একই astronomical instant-এর দুটি presentation।
দিনমান ও রাত্রিমান কী?
রাত্রিমান = Sunrise(D + 1) − Sunset(D)
পঞ্জিকা দিবস = দিনমান + রাত্রিমান
= Sunrise(D + 1) − Sunrise(D)
সব subtraction absolute UTC/JD instant-এ করতে হবে। Local clock label থেকে সরাসরি বিয়োগ করলে daylight-saving transition-এ এক ঘণ্টার ভুল হতে পারে।
USNO “duration of daylight” বলতে low/mid latitude-এ sunrise থেকে sunset পর্যন্ত কোনো অংশের Sun horizon-এর ওপরে থাকার elapsed duration বোঝায়। আপনার project-এর দিনমানও chosen sunrise/sunset profile অনুযায়ী একই interval concept।
দণ্ড, ঘটিকা, নাড়ী, পল ও বিপল
নাম অঞ্চল ও গ্রন্থভেদে বদলালেও calculation hierarchy:
| Unit | সম্পর্ক | Fixed SI conversion |
|---|---|---|
| অহোরাত্র/দিন | ৬০ দণ্ড/ঘটিকা | ২৪ ঘণ্টা |
| দণ্ড/ঘটিকা/নাড়ী | ৬০ পল | ২৪ মিনিট = ১৪৪০ সেকেন্ড |
| পল/বিঘটিকা/বিনাড়ী | ৬০ বিপল | ২৪ সেকেন্ড |
| বিপল | ১/৬০ পল | ০.৪ সেকেন্ড |
| মুহূর্ত | ২ দণ্ড | ৪৮ মিনিট |
১ দণ্ড = ৬০ পল = ৩৬০০ বিপল
Sūrya-Siddhānta translation-এ ছয় prāṇa-তে এক pala এবং ৬০ pala-তে এক ghaṭikā বলা হয়েছে। Sanskrit astronomical tables-এর sexagesimal notation-এ প্রতিটি পরবর্তী unit আগেরটির ১/৬০।
Sunrise-to-sunrise সাবন দিন
Indian calendar context-এ civil বা sāvana day sunrise থেকে পরের sunrise পর্যন্ত reckoned হতে পারে। কিন্তু modern precise ephemeris-এ successive sunrise-এর UTC difference প্রতিদিন ঠিক ৮৬,৪০০ second হয় না:
- Sun declination বদলায়;
- equation of time বদলায়;
- refraction/profile threshold প্রভাব ফেলে;
- DST local clock label বদলায়।
ফলে digital implementation-এ “৬০ দণ্ড” কীভাবে map হবে—এটি profile decision।
Fixed ২৪-minute unit বনাম normalized ৬০-দণ্ড day
| Mode | Formula | বৈশিষ্ট্য |
|---|---|---|
fixed-mean-24m | Elapsed seconds ÷ ১৪৪০ | ১ দণ্ড সর্বদা ২৪ মিনিট; clock time conversion সহজ |
normalized-sunrise-60 | Elapsed ÷ sunrise-span × ৬০ | পরের sunrise ঠিক ৬০ দণ্ড; unit সামান্য variable |
এই project-এর printed event ending-time—যেমন তিথি, নক্ষত্র, করণ ও যোগের দং/পল/বিপল—এর জন্য recommended default fixed-mean-24m। Research export-এ normalized value চাইলে আলাদা key দিন; একই column-এ method silently বদলাবেন না।
উদাহরণ: sunrise span ২৪ ঘণ্টা ১ মিনিট হলে exact next sunrise fixed mode-এ ৬০ দণ্ড ২.৫ পল; normalized mode-এ ঠিক ৬০ দণ্ড। দুটোই নিজ নিজ সংজ্ঞায় সঙ্গত।
Seasonal day ও night muhurta
দিনমান ও রাত্রিমান আলাদাভাবে ১৫ muhurta-তে ভাগ করলে:
NightMuhūrta = রাত্রিমান ÷ ১৫
Equinox-এর কাছে দুটো প্রায় ৪৮ মিনিট। গ্রীষ্মে day-muhūrta দীর্ঘ ও night-muhūrta ছোট; শীতে উল্টো। Brahma-muhūrta seasonal method, Rahukāla-এর daylight eighth, Sandhyā window বা Muhūrta table-এর মতো feature-এ এই proportional duration লাগতে পারে।
Astronomical event-এর দণ্ড-পল
Event instant E যদি sunrise-to-next-sunrise interval-এ থাকে:
fixed ghaṭikā = elapsedSeconds ÷ ১৪৪০
normalized ghaṭikā = elapsedSeconds ÷ spanSeconds × ৬০
Boundary inclusion:
SunriseUtc <= EventUtc && EventUtc < NextSunriseUtc
Exact next sunrise পরের Panchanga day-এর ০ দণ্ড, current day-এর ৬০ দণ্ড event নয়। Duplicate এড়াতে half-open interval ব্যবহার করুন।
Civil midnight ও “নিশা”
দণ্ড-পল sunrise থেকে elapsed হওয়ায় civil midnight-এ zero হয় না। Sunrise 06:00 হলে midnight fixed mode-এ ৪৫ দণ্ড। পরদিন ভোর 03:00 হলে ৫২ দণ্ড ৩০ পল। তাই:
- clock date বদলালেও দণ্ড count চলতে থাকে;
- post-midnight event-এ “নিশা” label দিন;
- sorting absolute instant-এ করুন;
- পরের sunrise-এ নতুন day-এর ০ দণ্ড।
Sunrise/sunset profile দিনমান বদলায়
Upper-limb + refraction sunrise আগে ও sunset পরে; center/no-refraction sunrise পরে ও sunset আগে। তাই first profile-এর দিনমান দীর্ঘ। Profile বদলালে:
- দিনমান ও রাত্রিমান;
- sunrise-elapsed দণ্ড-পল;
- seasonal muhurta length;
- Aruṇodaya/Brahma interval;
- near-sunrise festival classification
সব পুনর্গণনা করতে হবে। Cache key-তে rise/set profile ও version রাখুন।
মধ্যাহ্ন কি sunrise–sunset-এর ঠিক মাঝখান?
Day midpoint:
এটি interval midpoint; astronomical solar transit-এর substitute নয়। Declination change, asymmetric horizon/refraction বা terrain profile থাকলে transit midpoint থেকে সরে যেতে পারে। মধ্যাহ্ন/meridian-transit দরকার হলে ephemeris transit function ব্যবহার করুন এবং daylight-midpoint আলাদা key রাখুন।
C# 5-compatible data model
public enum VedicTimeMode
{
FixedMeanTwentyFourMinutes,
NormalizedSunriseSpan
}
public sealed class DandaPalaValue
{
public int Danda { get; set; }
public int Pala { get; set; }
public double Vipala { get; set; }
public double TotalSeconds { get; set; }
public VedicTimeMode Mode { get; set; }
}
public sealed class DayNightMeasure
{
public DateTime LocalAnchorDate { get; set; }
public DateTimeOffset SunriseUtc { get; set; }
public DateTimeOffset SunsetUtc { get; set; }
public DateTimeOffset NextSunriseUtc { get; set; }
public TimeSpan DayDuration { get; set; }
public TimeSpan NightDuration { get; set; }
public TimeSpan VedicDayDuration { get; set; }
public TimeSpan DayMuhurta { get; set; }
public TimeSpan NightMuhurta { get; set; }
public string SolarEventProfile { get; set; }
}
public sealed class VedicTimeProfile
{
public string Key { get; set; }
public string Version { get; set; }
public VedicTimeMode Mode { get; set; }
public int FractionDigits { get; set; }
}
দিনমান–রাত্রিমান measure
static DayNightMeasure BuildDayNightMeasure(
DateTime localAnchorDate,
DateTimeOffset sunriseUtc,
DateTimeOffset sunsetUtc,
DateTimeOffset nextSunriseUtc,
string solarEventProfile)
{
sunriseUtc = sunriseUtc.ToUniversalTime();
sunsetUtc = sunsetUtc.ToUniversalTime();
nextSunriseUtc = nextSunriseUtc.ToUniversalTime();
if (sunsetUtc <= sunriseUtc)
throw new ArgumentException(
"Sunset must be after sunrise.");
if (nextSunriseUtc <= sunsetUtc)
throw new ArgumentException(
"Next sunrise must be after sunset.");
TimeSpan day = sunsetUtc - sunriseUtc;
TimeSpan night = nextSunriseUtc - sunsetUtc;
TimeSpan whole = nextSunriseUtc - sunriseUtc;
return new DayNightMeasure
{
LocalAnchorDate = localAnchorDate.Date,
SunriseUtc = sunriseUtc,
SunsetUtc = sunsetUtc,
NextSunriseUtc = nextSunriseUtc,
DayDuration = day,
NightDuration = night,
VedicDayDuration = whole,
DayMuhurta = TimeSpan.FromTicks(day.Ticks / 15L),
NightMuhurta = TimeSpan.FromTicks(night.Ticks / 15L),
SolarEventProfile = solarEventProfile
};
}
DayDuration + NightDuration == VedicDayDuration invariant test করুন। Tick division-এর remainder sub-tick; display precision-এর নিচে।
Fixed ২৪-minute conversion
Carry-safe conversion-এর জন্য hundredth-of-vipala integer ব্যবহার করা যায়:
static DandaPalaValue FromSecondsFixed(double totalSeconds)
{
if (Double.IsNaN(totalSeconds) ||
Double.IsInfinity(totalSeconds) ||
totalSeconds < 0.0)
throw new ArgumentOutOfRangeException("totalSeconds");
const double SecondsPerVipala = 0.4;
const long HundredthsPerPala = 60L * 100L;
const long HundredthsPerDanda =
60L * HundredthsPerPala;
long hundredthsOfVipala = (long)Math.Round(
totalSeconds / SecondsPerVipala * 100.0,
MidpointRounding.AwayFromZero);
int danda = (int)(
hundredthsOfVipala / HundredthsPerDanda);
long remainder =
hundredthsOfVipala % HundredthsPerDanda;
int pala = (int)(remainder / HundredthsPerPala);
long vipalaHundredths = remainder % HundredthsPerPala;
return new DandaPalaValue
{
Danda = danda,
Pala = pala,
Vipala = vipalaHundredths / 100.0,
TotalSeconds = totalSeconds,
Mode = VedicTimeMode.FixedMeanTwentyFourMinutes
};
}
Rounding প্রথমেই smallest displayed unit-এ হওয়ায় ৫৯.৯৯৬ বিপল automatically next pala-তে carry হবে; ৫৯ pala carry হয়ে next danda। Manual floating-point carry chain-এর edge bug এড়ায়।
Normalized ৬০-দণ্ড conversion
static DandaPalaValue FromElapsedNormalized(
TimeSpan elapsed,
TimeSpan sunriseSpan)
{
if (sunriseSpan.TotalSeconds <= 0.0)
throw new ArgumentOutOfRangeException("sunriseSpan");
if (elapsed.TotalSeconds < 0.0 ||
elapsed > sunriseSpan)
throw new ArgumentOutOfRangeException("elapsed");
double normalizedSeconds =
elapsed.TotalSeconds * 86400.0 /
sunriseSpan.TotalSeconds;
DandaPalaValue value = FromSecondsFixed(normalizedSeconds);
value.Mode = VedicTimeMode.NormalizedSunriseSpan;
return value;
}
Exact elapsed == sunriseSpan ৬০/০০/০০ দেবে; event assignment-এ next sunrise excluded হওয়ায় daily event list-এ এই value থাকবে না। Diagnostics-এ span endpoint test করতে এটি বৈধ।
বাংলা carry-safe formatter
static string FormatDandaPala(
DandaPalaValue value,
Func<string, string> bengaliDigits)
{
string latin = String.Format(
CultureInfo.InvariantCulture,
"{0}/{1:00}/{2:00.00}",
value.Danda,
value.Pala,
value.Vipala);
return "দং " + bengaliDigits(latin);
}
Example:
দং ৪০/৪৬/১৬.৬২
Machine output-এ integer hundredths অথবা raw seconds রাখুন; localized string parsing করে data ফিরিয়ে আনবেন না।
Event instant থেকে দণ্ড-পল
static DandaPalaValue AtEventInstant(
DateTimeOffset eventUtc,
DayNightMeasure day,
VedicTimeMode mode)
{
eventUtc = eventUtc.ToUniversalTime();
if (eventUtc < day.SunriseUtc ||
eventUtc >= day.NextSunriseUtc)
throw new ArgumentOutOfRangeException("eventUtc");
TimeSpan elapsed = eventUtc - day.SunriseUtc;
if (mode == VedicTimeMode.NormalizedSunriseSpan)
return FromElapsedNormalized(
elapsed, day.VedicDayDuration);
return FromSecondsFixed(elapsed.TotalSeconds);
}
Live instant sunrise-এর আগে হলে প্রথমে previous Panchanga anchor resolve করুন; negative elapsed-কে ৬০ দণ্ড যোগ করে patch করবেন না।
Time zone, DST ও duration
New York spring transition-এ local clock 01:59 থেকে 03:00 হতে পারে। যদি sunrise ও previous sunset local wall-time দিয়ে subtract করেন, night এক ঘণ্টা বেশি/কম হবে। সঠিক:
TimeSpan duration =
endUtc.ToUniversalTime() - startUtc.ToUniversalTime();
UTC/JD duration physical elapsed time। Local zone কেবল output label। Fixed দণ্ড ১৪৪০ SI seconds; DST wall-clock minute নয়।
Historical JD calculation
fixedDanda = (JD₂ − JD₁) × ৬০
কারণ ১ mean day = ৬০ fixed দণ্ড। Early historical year-এ core duration JD double/decimal-এ রাখলে DateTime range ও Julian/Gregorian label সমস্যা এড়ানো যায়।
Sub-second output-এর জন্য UT/TT/ΔT এবং floating precision document করুন। Civil UTC leap-second model ও ephemeris UT convention একই নয়; সাধারণ Panchanga seconds-এর নিচে না গেলে practical effect সীমিত।
Polar day/night
Chosen civil date-এ sunrise বা sunset না থাকলে simple দিনমান–রাত্রিমান triplet তৈরি হয় না। Status:
NoSunrise
NoSunset
SunAboveHorizonAllDay
SunBelowHorizonAllDay
UnsupportedPolarPolicy
Sunset missing হলে DayDuration=24h silently বসাবেন না; threshold/profile অনুযায়ী continuous condition এবং exact interval boundaries আলাদা করে report করুন। Seasonal muhurta fallback নিলে published authority দরকার।
API ও XML output
{
"anchorDate": "2026-10-09",
"solarProfile": "hindu-center-geometric",
"sunrise": "2026-10-09T05:54:00+06:00",
"sunset": "2026-10-09T17:41:00+06:00",
"nextSunrise": "2026-10-10T05:54:22+06:00",
"dinamana": {
"seconds": 42420,
"clock": "11:47:00",
"fixedVedic": "29/27/30.00"
},
"ratrimana": {
"seconds": 44002,
"clock": "12:13:22",
"fixedVedic": "30/33/25.00"
},
"dayMuhurtaSeconds": 2828,
"nightMuhurtaSeconds": 2933.466667,
"eventTimeMode": "fixed-mean-24m"
}
উপরের সময়/সংখ্যা format example; verified astronomical test vector নয়। XML:
<day-night anchor-date="2026-10-09"
solar-profile="hindu-center-geometric"
vedic-time-mode="fixed-mean-24m">
<sunrise local="2026-10-09T05:54:00+06:00" />
<sunset local="2026-10-09T17:41:00+06:00" />
<next-sunrise local="2026-10-10T05:54:22+06:00" />
<dinamana seconds="42420" danda-pala="29/27/30.00" />
<ratrimana seconds="44002" danda-pala="30/33/25.00" />
</day-night>
সাধারণ implementation error
| ভুল | ফল | সংশোধন |
|---|---|---|
| ১ দণ্ড = ৬০ মিনিট | Unit ২.৫× বড় | ১ দণ্ড = ২৪ মিনিট |
| ১ পল = ১ মিনিট | Wrong sexagesimal scale | ১ পল = ২৪ সেকেন্ড |
| বিপল = ১ সেকেন্ড | ২.৫× error | ১ বিপল = ০.৪ সেকেন্ড |
| Local clock subtraction | DST duration error | UTC/JD subtraction |
| Fixed ও normalized একই label | Reproduction impossible | Mode key/version |
| Seasonal muhurta = ৪৮ মিনিট | ঋতুভেদ হারায় | Day/night ÷১৫ |
| Midnight-এ danda zero | Panchanga day ভেঙে যায় | Sunrise anchor |
| Next sunrise current event | Duplicate ৬০/০ | Half-open interval |
| Float carry manually | ৫৯.৯৯→invalid ৬০ | Smallest-unit integer rounding |
| Day midpoint = solar transit | Subtle timing mismatch | Dedicated transit calculation |
| Sunrise profile omitted | দিনমান compare করা যায় না | Profile metadata |
| Polar missing event fallback | Fabricated duration | Explicit status/policy |
Validation checklist
- ১ day = ৬০ দণ্ড;
- ১ দণ্ড = ৬০ pala;
- ১ pala = ৬০ vipala;
- ১ দণ্ড = ১৪৪০ seconds;
- ১ pala = ২৪ seconds;
- ১ vipala = ০.৪ seconds;
- ১ muhurta = ২ দণ্ড = ৪৮ minutes;
- দিনমান = sunset−sunrise;
- রাত্রিমান = next sunrise−sunset;
- দিনমান + রাত্রিমান = sunrise span;
- Sunrise < sunset < next sunrise;
- Day muhurta = day/15;
- Night muhurta = night/15;
- Equinox day/night muhurta near equal;
- Summer day muhurta longer;
- Winter night muhurta longer;
- Fixed ১৪৪০ seconds → ১/০০/০০;
- Fixed ২৪ seconds → ০/০১/০০;
- Fixed ০.৪ seconds → ০/০০/০১;
- ২৩:৫৯:৫৯.৬ rounds correctly;
- Vipala carry to pala;
- Pala carry to danda;
- Negative duration rejected;
- NaN rejected;
- Infinity rejected;
- Normalized zero elapsed → ০;
- Normalized half span → ৩০ দণ্ড;
- Normalized full span → ৬০ দণ্ড;
- Event at sunrise included as ০;
- Event one second before next sunrise included;
- Exact next sunrise excluded;
- Post-midnight danda remains continuous;
- Pre-sunrise live instant resolves previous anchor;
- UTC comparison only;
- DST spring duration;
- DST fall duration;
- Dhaka regression;
- Kolkata regression;
- New York regression;
- Upper-limb/refraction profile;
- Center/no-refraction profile;
- Profile change invalidates cache;
- Day midpoint distinct key;
- Solar transit ephemeris test;
- Historical JD duration;
- Julian/Gregorian same interval;
- Polar no-sunrise status;
- Polar no-sunset status;
- HTML/API/XML same raw seconds;
- বাংলা digit formatting only at presentation;
- Printed Panchanga দণ্ড-পল comparison।
উপসংহার
দিনমান হলো sunrise থেকে sunset; রাত্রিমান সেই sunset থেকে next sunrise। Indian sexagesimal time-এ ৬০ দণ্ডে এক day, ৬০ pala-তে এক দণ্ড এবং ৬০ vipala-তে এক pala। Modern fixed conversion-এ এগুলো ২৪ মিনিট, ২৪ সেকেন্ড ও ০.৪ সেকেন্ড।
Actual sunrise span প্রতিদিন ঠিক ২৪ ঘণ্টা না হওয়ায় fixed 24-minute mode ও normalized sunrise-span-60 mode আলাদা ফল দিতে পারে। আপনার printed event time-এর জন্য fixed mode বজায় রাখুন; normalized mode research metadata হিসেবে আলাদা দিন। Seasonal ritual segments-এর জন্য day এবং night পৃথকভাবে ১৫ ভাগ করুন।
UTC/JD duration, half-open sunrise interval, carry-safe smallest-unit rounding এবং profile metadata ব্যবহার করলে clock time, দণ্ড-পল, Daily Details, yearly XML ও historical export একই exact instant প্রকাশ করবে।
তথ্যসূত্র ও আরও পাঠ
- Sūrya-Siddhānta English translation—time units; prāṇa, pala ও ghaṭikā সম্পর্ক.
- Ebenezer Burgess—Translation of the Sūrya-Siddhānta; public-domain source edition.
- Astronomical handbooks in 16th-century South Asia; ৬০ ghaṭikā, pala ও vipala-এর scholarly description.
- U.S. Naval Observatory—Duration of Daylight/Darkness; sunrise-to-sunset daylight duration.
- U.S. Naval Observatory—Rise, Set and Twilight Definitions; solar horizon event profile ও accuracy.
- U.S. Naval Observatory—Equation of Time; sunrise/sunset seasonal shift এবং solar-time context.
- Calendar Reform Committee historical summary; sunrise-day-এর ৬০ ghaṭikā এবং ১৫ seasonal muhūrta division.
- সূর্য সিদ্ধান্ত পঞ্জিকা project specification; sunrise-anchored দণ্ড-পল display, নিশা formatting ও fixed ২৪-minute event convention.
মন্তব্য, আলোচনা ও প্রশ্ন