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

অমান্ত ও পূর্ণিমান্ত মাস: একই তিথির মাসের নাম কেন আলাদা?

অমাবস্যান্ত ও পূর্ণিমান্ত চান্দ্রমাসের boundary, শুক্ল-কৃষ্ণপক্ষের month-name mapping, অধিমাস-ক্ষয়মাস এবং C# calculation model-এর বাংলা ব্যাখ্যা।

একটি website বলছে জন্মাষ্টমী “শ্রাবণ কৃষ্ণাষ্টমী”, অন্যটি বলছে “ভাদ্রপদ কৃষ্ণাষ্টমী”—এতে তিথি বা উৎসবের দিন বদলে যায়নি। প্রথমটি অমান্ত এবং দ্বিতীয়টি পূর্ণিমান্ত month-label ব্যবহার করছে। সমস্যা তখনই হয়, যখন software label-কে astronomical fact ভেবে এক system-এর মাস অন্য system-এর festival rule-এ সরাসরি ব্যবহার করে।

একই আকাশ, একই তিথি—শুধু মাসের bracket আলাদা

একটি lunar phase cycle-এ ৩০ তিথি:

অমান্ত ও পূর্ণিমান্ত উভয় system-ই এই একই phase cycle ব্যবহার করে। পার্থক্য হলো month boundary কোথায় কাটা হবে:

Systemমাস শুরুমাস শেষমাসের ভিতরে পক্ষের ক্রম
অমান্তঅমাবস্যার পরে শুক্ল প্রতিপদপরের অমাবস্যাশুক্ল → কৃষ্ণ
পূর্ণিমান্তপূর্ণিমার পরে কৃষ্ণ প্রতিপদপরের পূর্ণিমাকৃষ্ণ → শুক্ল

অমান্ত বা অমাবস্যান্ত মাস

Amānta = Amāvasyā + anta—অমাবস্যায় যার শেষ। একটি regular অমান্ত মাসের structure:

এই system-এ একই named month-এর প্রথমার্ধ শুক্লপক্ষ, দ্বিতীয়ার্ধ কৃষ্ণপক্ষ। যেমন অমান্ত শ্রাবণ: শ্রাবণ শুক্ল প্রতিপদ থেকে শ্রাবণ অমাবস্যা পর্যন্ত।

Software boundary wall-clock midnight নয়। New Moon/Amāvasyā tithi transition-এর astronomical instant আছে; daily display আবার sunrise rule অনুসরণ করতে পারে। LunarMonthSpan raw phase boundaries রাখবে, আর civil-day renderer sunrise-এ প্রযোজ্য label দেখাবে।

পূর্ণিমান্ত বা পূর্ণিমা-সমাপ্ত মাস

Pūrṇimānta = Pūrṇimā + anta—পূর্ণিমায় যার শেষ। একটি regular পূর্ণিমান্ত মাস:

এখানে named month-এর প্রথমার্ধ কৃষ্ণপক্ষ এবং দ্বিতীয়ার্ধ শুক্লপক্ষ। Full-moon boundary পার হওয়ার সঙ্গে পূর্ণিমান্ত calendar পরের month-name-এ যায়; অমান্ত calendar তখনও পুরোনো মাসের কৃষ্ণপক্ষ চালিয়ে যায়।

শুক্লপক্ষে নাম একই, কৃষ্ণপক্ষে আলাদা কেন?

দুটি system-এর month windows প্রায় অর্ধ-লুনেশন সরানো। কিন্তু named bright fortnight একই reference month-এর সঙ্গে যুক্ত থাকে। তাই regular cycle-এ:

উদাহরণ: অমান্ত শ্রাবণের শুক্লপক্ষ পূর্ণিমান্তেও শ্রাবণ শুক্লপক্ষ। পূর্ণিমার পর যে waning fortnight অমান্তে শ্রাবণ কৃষ্ণপক্ষ, পূর্ণিমান্ত calendar তখন ভাদ্রপদ মাস শুরু করেছে—তাই সেটি ভাদ্রপদ কৃষ্ণপক্ষ।

Regular মাসে exact mapping

Fieldঅমান্তপূর্ণিমান্ত
শুক্লপক্ষের month-nameMonth NMonth N
কৃষ্ণপক্ষের month-nameMonth NMonth N + 1
Tithi number in pakṣaএকইএকই
Pakṣaএকইএকই
Absolute tithi intervalএকইএকই
Festival instant/dateRule একই হলে একইRule একই হলে একই

এই simple N / N+1 rule regular months-এর জন্য। Adhika/Kṣaya মাস, special regional naming বা ambiguous boundary-তে explicit month engine দরকার—পরবর্তী অংশে ব্যাখ্যা আছে।

১২ মাসের regular কৃষ্ণপক্ষ correspondence

অমান্ত কৃষ্ণপক্ষপূর্ণিমান্ত কৃষ্ণপক্ষ
চৈত্রবৈশাখ
বৈশাখজ্যৈষ্ঠ
জ্যৈষ্ঠআষাঢ়
আষাঢ়শ্রাবণ
শ্রাবণভাদ্রপদ
ভাদ্রপদআশ্বিন
আশ্বিনকার্তিক
কার্তিকমার্গশীর্ষ/অগ্রহায়ণ
মার্গশীর্ষ/অগ্রহায়ণপৌষ
পৌষমাঘ
মাঘফাল্গুন
ফাল্গুনচৈত্র

শুক্লপক্ষের জন্য বাম ও ডান column একই হবে। Month name-এর spelling—ভাদ্রপদ/ভাদ্র, মার্গশীর্ষ/অগ্রহায়ণ—language resource-এ রাখুন; calculation model numeric identity রাখবে।

একই উৎসবের দুটি month-name

Astronomical observanceঅমান্ত নামপূর্ণিমান্ত নাম
কৃষ্ণ জন্মাষ্টমীশ্রাবণ কৃষ্ণ অষ্টমীভাদ্রপদ কৃষ্ণ অষ্টমী
মহাশিবরাত্রিমাঘ কৃষ্ণ চতুর্দশীফাল্গুন কৃষ্ণ চতুর্দশী
দীপাবলি অমাবস্যাআশ্বিন কৃষ্ণ অমাবস্যাকার্তিক কৃষ্ণ অমাবস্যা
হোলিকা পূর্ণিমাফাল্গুন শুক্ল পূর্ণিমাফাল্গুন শুক্ল পূর্ণিমা
রামনবমীচৈত্র শুক্ল নবমীচৈত্র শুক্ল নবমী

প্রথম তিনটি কৃষ্ণপক্ষের বলে month-name এক ধাপ আলাদা। শেষ দুটি শুক্লপক্ষের বলে একই। Festival rule যদি numeric month=5 hard-code করে কিন্তু system metadata না রাখে, এক অঞ্চলে ঠিক এবং অন্য অঞ্চলে ভুল match হবে।

চান্দ্রমাসের নাম কোথা থেকে আসে?

মাসের নামকরণের ঐতিহাসিক ব্যাখ্যায় পূর্ণিমার নক্ষত্র-সম্পর্ক এবং computational Panchanga-তে lunation-এর ভিতরের sidereal solar ingress—দুই ধরনের ভাষা দেখা যায়। Software-এর operational approach:

  1. Selected ephemeris দিয়ে consecutive New Moon instants solve করুন;
  2. দুই New Moon-এর মধ্যে কতটি nirayana solar ingress ঘটেছে নির্ণয় করুন;
  3. একটি ingress থাকলে mapping table অনুযায়ী regular amanta month-name দিন;
  4. শুক্ল/কৃষ্ণ pakṣa নির্ধারণ করুন;
  5. Regular case-এ purnimanta label derive করুন;
  6. Zero/two-ingress case-এ intercalation engine ব্যবহার করুন।

Project-এর Surya Siddhanta ও Drik engines আলাদা solar/lunar longitude দিতে পারে। Month identity কোন engine থেকে এসেছে তা result-এ লিখুন। Display-এর জন্য দুটির month label মিশিয়ে hybrid date বানাবেন না।

অধিমাস ও ক্ষয়মাসে simple “+1” যথেষ্ট নয়

সাধারণত একটি New-Moon-to-New-Moon lunation-এর মধ্যে একটি saṅkrānti থাকে। ব্যতিক্রম:

Ingress countClassificationঅর্থ
০অধিমাসExtra lunar month; following regular month-এর নামের সঙ্গে অধি prefix
১সাধারণ মাসRegular name mapping
২ক্ষয়মাসএকটি expected month-name suppressed; অত্যন্ত বিরল

পূর্ণিমান্ত boundary অমান্ত boundary থেকে অর্ধ-লুনেশন সরানো; তাই adhika prefix কোন কৃষ্ণ ও শুক্ল পক্ষের সঙ্গে display হবে তা regional convention অনুযায়ী সাবধানে নির্ধারণ করতে হয়। Production code-এ:

  • purnimanta = Next(amanta) করে adhika flag blind copy করবেন না;
  • Current এবং adjacent lunation-এর identity metadata রাখুন;
  • Explicit full-moon boundary markers সংরক্ষণ করুন;
  • Adhika/Nija pair আলাদা identity দিন;
  • Kṣaya month-এ skipped name ও surrounding months trace করুন;
  • Uncertain historical case-এ warning দিন, fabricated regular label নয়।

Amanta/Purnimanta এবং lunar year-start একই setting নয়

Month boundary জানলেই year কখন শুরু হবে জানা যায় না। আলাদা tradition-এ year start Chaitra, Kartika বা অন্য মাস হতে পারে। তাই configuration পৃথক রাখুন:

LunarMonthSystem = Amanta | Purnimanta
LunarYearStartMonth = Chaitra | Kartika | ...
Era = Vikrama | Shaka | Gaurabda | ...
MonthNamingProfile = ...
FestivalRuleProfile = ...

Gujarat-এ amanta reckoning ব্যবহৃত হলেও new-year tradition অন্য amanta region-এর মতো নাও হতে পারে। User location দেখে সব setting অনুমান করবেন না; location default দিতে পারেন, কিন্তু UI-তে override রাখুন।

বাংলা সৌরমাস ও বৈষ্ণব চান্দ্রমাস আলাদা

বাংলা বৈশাখ, জ্যৈষ্ঠ ইত্যাদি solar saṅkrānti ও sunrise rule-ভিত্তিক; amanta/purnimanta month lunar phase-ভিত্তিক। একই নাম থাকলেও model field আলাদা:

FieldBoundaryউদাহরণ
Bengali solar monthSaṅkrānti + Bengali month-start ruleবাংলা শ্রাবণ ১৪৩৩
Amanta lunar monthNew Moon-to-New Moonশ্রাবণ কৃষ্ণ অষ্টমী
Purnimanta lunar monthFull Moon-to-Full Moonভাদ্রপদ কৃষ্ণ অষ্টমী
Vaiṣṇava monthChosen sampradāya ruleহৃষীকেশ মাস

Daily details-এ চারটি label থাকলে heading স্পষ্ট করুন। “শ্রাবণ” string দেখে Bengali solar month ও lunar Shravana-কে একই enum বানাবেন না।

Festival engine কোন মাস ব্যবহার করবে?

Festival rule data-তে system declare করুন:

<festival id="janmashtami"
          month-system="amanta"
          month="shravana"
          paksha="krishna"
          tithi="8"
          rule-moment="nishitha" />

অথবা astronomical identity-কে canonical করে aliases রাখুন:

<lunar-date-aliases>
  <amanta month="shravana" paksha="krishna" tithi="8" />
  <purnimanta month="bhadrapada" paksha="krishna" tithi="8" />
</lunar-date-aliases>

Actual Janmāṣṭamī selection শুধু month+tithi নয়; নিশীথে অষ্টমী, নক্ষত্র ও tradition-specific tie-break থাকতে পারে। Month system candidate search সীমিত করতে সাহায্য করে, final rule-moment নয়।

C# 5-compatible model

public enum LunarMonthSystem
{
    Amanta,
    Purnimanta
}

public enum LunarPaksha
{
    Shukla,
    Krishna
}

public enum LunarMonthKind
{
    Regular,
    Adhika,
    Nija,
    KshayaContext,
    Undetermined
}

public sealed class LunarMonthIdentity
{
    public LunarMonthSystem System { get; set; }
    public int MonthNumber { get; set; }
    public string MonthKey { get; set; }
    public LunarMonthKind Kind { get; set; }
    public DateTimeOffset BoundaryStart { get; set; }
    public DateTimeOffset BoundaryEnd { get; set; }
    public int SolarIngressCount { get; set; }
    public string CalculationProfileId { get; set; }
}

Regular-month mapping helper:

public static int NextMonth(int month)
{
    if (month < 1 || month > 12)
        throw new ArgumentOutOfRangeException("month");
    return month == 12 ? 1 : month + 1;
}

public static int RegularPurnimantaMonth(
    int amantaMonth,
    LunarPaksha paksha,
    LunarMonthKind kind)
{
    if (kind != LunarMonthKind.Regular)
        throw new InvalidOperationException(
            "Adhika/Kshaya month requires explicit boundary calculation.");

    return paksha == LunarPaksha.Shukla
        ? amantaMonth
        : NextMonth(amantaMonth);
}

দুটি identity পাশাপাশি:

public sealed class LunarDateResult
{
    public int TithiInPaksha { get; set; }
    public LunarPaksha Paksha { get; set; }
    public LunarMonthIdentity Amanta { get; set; }
    public LunarMonthIdentity Purnimanta { get; set; }
    public string RuleTrace { get; set; }
}

public sealed class LunarMonthSpan
{
    public DateTimeOffset Start { get; set; }
    public DateTimeOffset End { get; set; }
    public string StartPhase { get; set; }
    public string EndPhase { get; set; }
    public IList<DateTimeOffset> SolarIngresses { get; set; }
}

Amanta span New Moon boundary দিয়ে; Purnimanta span Full Moon boundary দিয়ে তৈরি করুন। Regular optimization ব্যবহার করলেও result-এ derived source লিখুন:

result.RuleTrace = paksha == LunarPaksha.Shukla
    ? "PURNIMANTA_SAME_AS_AMANTA_IN_SHUKLA"
    : "PURNIMANTA_NEXT_REGULAR_MONTH_IN_KRISHNA";

UI, print, search ও URL design

Daily details:

Search aliases:

  • “শ্রাবণ কৃষ্ণ অষ্টমী”;
  • “ভাদ্রপদ কৃষ্ণ অষ্টমী”;
  • “Janmashtami”;
  • Canonical festival ID janmashtami।

দুই month-name-এর জন্য duplicate festival record তৈরি করবেন না। একটি canonical event-এ localized aliases রাখুন। URL-ও stable festival ID ব্যবহার করবে; month-label বদলালেও canonical URL বদলাবে না।

Printed Panjika-তে regional default prominently দেখাতে পারেন, অন্য system parenthesis-এ:

শ্রাবণ কৃষ্ণ অষ্টমী (পূর্ণিমান্ত মতে ভাদ্রপদ কৃষ্ণ অষ্টমী)

Historical text বা inscription পড়ার সময়

পুরোনো গ্রন্থে “ফাল্গুন কৃষ্ণ চতুর্দশী” দেখলে আধুনিক Gregorian date বের করার আগে জানতে হবে:

  • লেখক/অঞ্চল কোন month system ব্যবহার করেছে;
  • Era ও year-start convention কী;
  • Amanta না Purnimanta;
  • Adhika/Nija month ছিল কি না;
  • তিথি sunrise-based না অন্য ritual moment-এ assigned;
  • Julian না Gregorian civil-date display।

একই phrase-কে system না জেনে modern date-এ map করলে প্রায় অর্ধ-মাস বা এক month-name error হতে পারে। Historical exporter তাই lunarMonthSystem metadata বাধ্যতামূলক করবে।

API ও XML output

{
  "lunarDate": {
    "paksha": "krishna",
    "tithi": 8,
    "tithiNameBn": "অষ্টমী",
    "amanta": {
      "month": 5,
      "key": "shravana",
      "nameBn": "শ্রাবণ",
      "kind": "regular"
    },
    "purnimanta": {
      "month": 6,
      "key": "bhadrapada",
      "nameBn": "ভাদ্রপদ",
      "kind": "regular"
    },
    "mappingRule": "PURNIMANTA_NEXT_REGULAR_MONTH_IN_KRISHNA"
  }
}

XML:

<lunar-date paksha="krishna" tithi="8">
  <month system="amanta" number="5" key="shravana"
         kind="regular">শ্রাবণ</month>
  <month system="purnimanta" number="6" key="bhadrapada"
         kind="regular">ভাদ্রপদ</month>
  <mapping rule="PURNIMANTA_NEXT_REGULAR_MONTH_IN_KRISHNA" />
</lunar-date>

Adhika/Kṣaya case-এ boundary start/end, ingress count এবং profile ID যোগ করুন। API consumer যেন name string parse না করে numeric/key fields ব্যবহার করে।

Validation checklist

  1. Amanta boundary consecutive New Moons;
  2. Purnimanta boundary consecutive Full Moons;
  3. Phase boundary absolute instant-এ stored;
  4. Shukla Paksha-তে regular names identical;
  5. Krishna Paksha-তে Purnimanta = next regular month;
  6. Phalguna → Chaitra wrap tested;
  7. Chaitra Krishna → Vaishakha Krishna tested;
  8. Shravana Krishna → Bhadrapada Krishna tested;
  9. Ashvina Krishna → Kartika Krishna tested;
  10. Janmashtami dual label tested;
  11. Maha Shivaratri dual label tested;
  12. Diwali Amavasya dual label tested;
  13. Rama Navami same-name test;
  14. Holi Purnima same-name test;
  15. Tithi ও pakṣa দুই system-এ identical;
  16. Nakṣatra ও weekday identical;
  17. Regular mapping only when kind=Regular;
  18. Zero ingress = Adhika classifier;
  19. One ingress = Regular classifier;
  20. Two ingresses = Kṣaya context;
  21. Adhika prefix blind copy নয়;
  22. Adhika/Nija identity পৃথক;
  23. Kṣaya skipped-name trace আছে;
  24. Surya Siddhanta/Drik method ID আছে;
  25. Ayanāṃśa/reference profile explicit;
  26. Month system ও year-start setting পৃথক;
  27. Era setting পৃথক;
  28. Bengali solar month আলাদা field;
  29. Vaiṣṇava month আলাদা field;
  30. Festival record-এ month-system declared;
  31. Search দুই month-name alias খুঁজে পায়;
  32. Duplicate festival record নেই;
  33. Print report regional default ও alternate name দেখায়;
  34. Historical export system metadata দেয়;
  35. API/XML numeric key + localized name দেয়;
  36. Known printed North/South Panchanga regression cases মেলে।

উপসংহার

অমান্ত ও পূর্ণিমান্ত দুটি প্রতিদ্বন্দ্বী astronomy নয়; একই ৩০-তিথির lunar cycle-কে দুই জায়গায় কেটে মাস বানানোর দুটি বৈধ convention। অমান্ত মাস অমাবস্যায় শেষ এবং শুক্লপক্ষ দিয়ে শুরু; পূর্ণিমান্ত মাস পূর্ণিমায় শেষ এবং কৃষ্ণপক্ষ দিয়ে শুরু। তাই regular শুক্লপক্ষে month-name একই, কৃষ্ণপক্ষে পূর্ণিমান্ত নাম অমান্তের পরের মাস।

Software-এ তিথি, pakṣa ও raw phase boundaries canonical রাখুন; Amanta ও Purnimanta identity পৃথক fields-এ দিন। Regular case-এ deterministic mapping করা যায়, কিন্তু Adhika/Kṣaya month-এ explicit ingress-aware engine দরকার। Year-start, era, Bengali solar month ও Vaiṣṇava month—সবগুলোকে আলাদা configuration হিসেবে রাখলে একই শব্দের কারণে model মিশে যায় না।

User-কে দুটি নাম পাশাপাশি দেখানোই সবচেয়ে স্বচ্ছ সমাধান। এতে উত্তর ও দক্ষিণ ভারতের পঞ্জিকা, ঐতিহাসিক গ্রন্থ এবং বিভিন্ন festival source-এর ভাষা একই astronomical দিনের সঙ্গে মিলিয়ে বোঝা যায়।

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

  1. Robert Sewell ও Śaṅkara Bālkṛṣṇa Dīkṣita—The Indian Calendar, correspondence table; Amanta ও Purnimanta month/pakṣa mapping-এর ঐতিহাসিক table.
  2. Open Pañcāṅga—What do amānta and pūrṇimānta mean?; new-moon/full-moon boundaries, Janmāṣṭamī dual label এবং computational outline.
  3. BAPS—Indian Calendar System; full-moon-ending ও new-moon-ending month systems এবং pakṣa structure.
  4. Drik Panchang—Purnimanta and Amanta options; contemporary regional option overview.
  5. The Indian Calendar—digitized edition; historical calendrical rules, correspondence ও conversion reference.
  6. Why Adhik Maas Happens; zero-ingress Adhika এবং two-ingress Kṣaya month-এর explanatory treatment.
  7. সূর্য সিদ্ধান্ত পঞ্জিকা project specification; dual lunar-month display, separate Bengali solar date এবং versioned calculation profiles.

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