সূর্য সিদ্ধান্ত পঞ্জিকা সকল প্রবন্ধ

দিনমান, রাত্রিমান ও দণ্ড-পল: seasonal duration এবং বৈদিক সময় কীভাবে নির্ণীত হয়?

Sunrise–sunset দিনমান, sunset–next sunrise রাত্রিমান, ৬০ দণ্ড–পল–বিপল, fixed ও normalized Vedic time এবং C# formatter।

Printed Panchanga-তে “দং ৪০/৪৬/১৬.৬২ পর্যন্ত” দেখলে সেটি ৪০ ঘণ্টা নয়। অর্থ হলো chosen sunrise থেকে ৪০ দণ্ড, ৪৬ পল ও ১৬.৬২ বিপল elapsed time। Fixed conversion-এ এটি (৪০×২৪) মিনিট + (৪৬×২৪) সেকেন্ড + (১৬.৬২×০.৪) সেকেন্ড। Clock time এবং দণ্ড-পল একই astronomical instant-এর দুটি presentation।

দিনমান ও রাত্রিমান কী?

সব 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

ModeFormulaবৈশিষ্ট্য
fixed-mean-24mElapsed seconds ÷ ১৪৪০১ দণ্ড সর্বদা ২৪ মিনিট; clock time conversion সহজ
normalized-sunrise-60Elapsed ÷ 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-তে ভাগ করলে:

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-এ থাকে:

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

কারণ ১ 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 subtractionDST duration errorUTC/JD subtraction
Fixed ও normalized একই labelReproduction impossibleMode key/version
Seasonal muhurta = ৪৮ মিনিটঋতুভেদ হারায়Day/night ÷১৫
Midnight-এ danda zeroPanchanga day ভেঙে যায়Sunrise anchor
Next sunrise current eventDuplicate ৬০/০Half-open interval
Float carry manually৫৯.৯৯→invalid ৬০Smallest-unit integer rounding
Day midpoint = solar transitSubtle timing mismatchDedicated transit calculation
Sunrise profile omittedদিনমান compare করা যায় নাProfile metadata
Polar missing event fallbackFabricated durationExplicit status/policy

Validation checklist

  1. ১ day = ৬০ দণ্ড;
  2. ১ দণ্ড = ৬০ pala;
  3. ১ pala = ৬০ vipala;
  4. ১ দণ্ড = ১৪৪০ seconds;
  5. ১ pala = ২৪ seconds;
  6. ১ vipala = ০.৪ seconds;
  7. ১ muhurta = ২ দণ্ড = ৪৮ minutes;
  8. দিনমান = sunset−sunrise;
  9. রাত্রিমান = next sunrise−sunset;
  10. দিনমান + রাত্রিমান = sunrise span;
  11. Sunrise < sunset < next sunrise;
  12. Day muhurta = day/15;
  13. Night muhurta = night/15;
  14. Equinox day/night muhurta near equal;
  15. Summer day muhurta longer;
  16. Winter night muhurta longer;
  17. Fixed ১৪৪০ seconds → ১/০০/০০;
  18. Fixed ২৪ seconds → ০/০১/০০;
  19. Fixed ০.৪ seconds → ০/০০/০১;
  20. ২৩:৫৯:৫৯.৬ rounds correctly;
  21. Vipala carry to pala;
  22. Pala carry to danda;
  23. Negative duration rejected;
  24. NaN rejected;
  25. Infinity rejected;
  26. Normalized zero elapsed → ০;
  27. Normalized half span → ৩০ দণ্ড;
  28. Normalized full span → ৬০ দণ্ড;
  29. Event at sunrise included as ০;
  30. Event one second before next sunrise included;
  31. Exact next sunrise excluded;
  32. Post-midnight danda remains continuous;
  33. Pre-sunrise live instant resolves previous anchor;
  34. UTC comparison only;
  35. DST spring duration;
  36. DST fall duration;
  37. Dhaka regression;
  38. Kolkata regression;
  39. New York regression;
  40. Upper-limb/refraction profile;
  41. Center/no-refraction profile;
  42. Profile change invalidates cache;
  43. Day midpoint distinct key;
  44. Solar transit ephemeris test;
  45. Historical JD duration;
  46. Julian/Gregorian same interval;
  47. Polar no-sunrise status;
  48. Polar no-sunset status;
  49. HTML/API/XML same raw seconds;
  50. বাংলা digit formatting only at presentation;
  51. 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 প্রকাশ করবে।

তথ্যসূত্র ও আরও পাঠ

  1. Sūrya-Siddhānta English translation—time units; prāṇa, pala ও ghaṭikā সম্পর্ক.
  2. Ebenezer Burgess—Translation of the Sūrya-Siddhānta; public-domain source edition.
  3. Astronomical handbooks in 16th-century South Asia; ৬০ ghaṭikā, pala ও vipala-এর scholarly description.
  4. U.S. Naval Observatory—Duration of Daylight/Darkness; sunrise-to-sunset daylight duration.
  5. U.S. Naval Observatory—Rise, Set and Twilight Definitions; solar horizon event profile ও accuracy.
  6. U.S. Naval Observatory—Equation of Time; sunrise/sunset seasonal shift এবং solar-time context.
  7. Calendar Reform Committee historical summary; sunrise-day-এর ৬০ ghaṭikā এবং ১৫ seasonal muhūrta division.
  8. সূর্য সিদ্ধান্ত পঞ্জিকা project specification; sunrise-anchored দণ্ড-পল display, নিশা formatting ও fixed ২৪-minute event convention.

মন্তব্য, আলোচনা ও প্রশ্ন