একটি website বলছে জন্মাষ্টমী “শ্রাবণ কৃষ্ণাষ্টমী”, অন্যটি বলছে “ভাদ্রপদ কৃষ্ণাষ্টমী”—এতে তিথি বা উৎসবের দিন বদলে যায়নি। প্রথমটি অমান্ত এবং দ্বিতীয়টি পূর্ণিমান্ত month-label ব্যবহার করছে। সমস্যা তখনই হয়, যখন software label-কে astronomical fact ভেবে এক system-এর মাস অন্য system-এর festival rule-এ সরাসরি ব্যবহার করে।
একই আকাশ, একই তিথি—শুধু মাসের bracket আলাদা
একটি lunar phase cycle-এ ৩০ তিথি:
১৫ কৃষ্ণ তিথি: পূর্ণিমা → অমাবস্যা
মোট = ৩০ তিথি ≈ এক synodic month
অমান্ত ও পূর্ণিমান্ত উভয় system-ই এই একই phase cycle ব্যবহার করে। পার্থক্য হলো month boundary কোথায় কাটা হবে:
| System | মাস শুরু | মাস শেষ | মাসের ভিতরে পক্ষের ক্রম |
|---|---|---|---|
| অমান্ত | অমাবস্যার পরে শুক্ল প্রতিপদ | পরের অমাবস্যা | শুক্ল → কৃষ্ণ |
| পূর্ণিমান্ত | পূর্ণিমার পরে কৃষ্ণ প্রতিপদ | পরের পূর্ণিমা | কৃষ্ণ → শুক্ল |
অমান্ত বা অমাবস্যান্ত মাস
Amānta = Amāvasyā + anta—অমাবস্যায় যার শেষ। একটি regular অমান্ত মাসের structure:
→ Śukla Pratipadā ... Pūrṇimā
→ Kṛṣṇa Pratipadā ... Amāvasyā
→ মাস শেষ
এই 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 পূর্ণিমান্ত মাস:
→ Kṛṣṇa Pratipadā ... Amāvasyā
→ Śukla Pratipadā ... Pūrṇimā
→ মাস শেষ
এখানে named month-এর প্রথমার্ধ কৃষ্ণপক্ষ এবং দ্বিতীয়ার্ধ শুক্লপক্ষ। Full-moon boundary পার হওয়ার সঙ্গে পূর্ণিমান্ত calendar পরের month-name-এ যায়; অমান্ত calendar তখনও পুরোনো মাসের কৃষ্ণপক্ষ চালিয়ে যায়।
শুক্লপক্ষে নাম একই, কৃষ্ণপক্ষে আলাদা কেন?
দুটি system-এর month windows প্রায় অর্ধ-লুনেশন সরানো। কিন্তু named bright fortnight একই reference month-এর সঙ্গে যুক্ত থাকে। তাই regular cycle-এ:
PūrṇimāntaMonth = AmāntaMonth
Kṛṣṇa Pakṣa:
PūrṇimāntaMonth = Next(AmāntaMonth)
উদাহরণ: অমান্ত শ্রাবণের শুক্লপক্ষ পূর্ণিমান্তেও শ্রাবণ শুক্লপক্ষ। পূর্ণিমার পর যে waning fortnight অমান্তে শ্রাবণ কৃষ্ণপক্ষ, পূর্ণিমান্ত calendar তখন ভাদ্রপদ মাস শুরু করেছে—তাই সেটি ভাদ্রপদ কৃষ্ণপক্ষ।
Regular মাসে exact mapping
| Field | অমান্ত | পূর্ণিমান্ত |
|---|---|---|
| শুক্লপক্ষের month-name | Month N | Month N |
| কৃষ্ণপক্ষের month-name | Month N | Month N + 1 |
| Tithi number in pakṣa | একই | একই |
| Pakṣa | একই | একই |
| Absolute tithi interval | একই | একই |
| Festival instant/date | Rule একই হলে একই | 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:
- Selected ephemeris দিয়ে consecutive New Moon instants solve করুন;
- দুই New Moon-এর মধ্যে কতটি nirayana solar ingress ঘটেছে নির্ণয় করুন;
- একটি ingress থাকলে mapping table অনুযায়ী regular amanta month-name দিন;
- শুক্ল/কৃষ্ণ pakṣa নির্ধারণ করুন;
- Regular case-এ purnimanta label derive করুন;
- 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 count | Classification | অর্থ |
|---|---|---|
| ০ | অধিমাস | 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 আলাদা:
| Field | Boundary | উদাহরণ |
|---|---|---|
| Bengali solar month | Saṅkrānti + Bengali month-start rule | বাংলা শ্রাবণ ১৪৩৩ |
| Amanta lunar month | New Moon-to-New Moon | শ্রাবণ কৃষ্ণ অষ্টমী |
| Purnimanta lunar month | Full Moon-to-Full Moon | ভাদ্রপদ কৃষ্ণ অষ্টমী |
| Vaiṣṇava month | Chosen 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
- Amanta boundary consecutive New Moons;
- Purnimanta boundary consecutive Full Moons;
- Phase boundary absolute instant-এ stored;
- Shukla Paksha-তে regular names identical;
- Krishna Paksha-তে Purnimanta = next regular month;
- Phalguna → Chaitra wrap tested;
- Chaitra Krishna → Vaishakha Krishna tested;
- Shravana Krishna → Bhadrapada Krishna tested;
- Ashvina Krishna → Kartika Krishna tested;
- Janmashtami dual label tested;
- Maha Shivaratri dual label tested;
- Diwali Amavasya dual label tested;
- Rama Navami same-name test;
- Holi Purnima same-name test;
- Tithi ও pakṣa দুই system-এ identical;
- Nakṣatra ও weekday identical;
- Regular mapping only when kind=Regular;
- Zero ingress = Adhika classifier;
- One ingress = Regular classifier;
- Two ingresses = Kṣaya context;
- Adhika prefix blind copy নয়;
- Adhika/Nija identity পৃথক;
- Kṣaya skipped-name trace আছে;
- Surya Siddhanta/Drik method ID আছে;
- Ayanāṃśa/reference profile explicit;
- Month system ও year-start setting পৃথক;
- Era setting পৃথক;
- Bengali solar month আলাদা field;
- Vaiṣṇava month আলাদা field;
- Festival record-এ month-system declared;
- Search দুই month-name alias খুঁজে পায়;
- Duplicate festival record নেই;
- Print report regional default ও alternate name দেখায়;
- Historical export system metadata দেয়;
- API/XML numeric key + localized name দেয়;
- 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 দিনের সঙ্গে মিলিয়ে বোঝা যায়।
তথ্যসূত্র ও আরও পাঠ
- Robert Sewell ও Śaṅkara Bālkṛṣṇa Dīkṣita—The Indian Calendar, correspondence table; Amanta ও Purnimanta month/pakṣa mapping-এর ঐতিহাসিক table.
- 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.
- BAPS—Indian Calendar System; full-moon-ending ও new-moon-ending month systems এবং pakṣa structure.
- Drik Panchang—Purnimanta and Amanta options; contemporary regional option overview.
- The Indian Calendar—digitized edition; historical calendrical rules, correspondence ও conversion reference.
- Why Adhik Maas Happens; zero-ingress Adhika এবং two-ingress Kṣaya month-এর explanatory treatment.
- সূর্য সিদ্ধান্ত পঞ্জিকা project specification; dual lunar-month display, separate Bengali solar date এবং versioned calculation profiles.
মন্তব্য, আলোচনা ও প্রশ্ন