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

দেশান্তর, স্থানীয় সময় ও Time Zone: ঐতিহ্যগত correction এবং আধুনিক clock conversion কীভাবে আলাদা?

দেশান্তর, local mean solar time, apparent solar time, UTC, civil time-zone ও DST-এর পার্থক্য এবং পঞ্জিকা সফটওয়্যারে সঠিক C# implementation।

পঞ্জিকার একটি ঘটনা প্রথমে একটি astronomical instant—যেমন Julian Day বা UTC moment। ব্যবহারকারী সেটি ঘড়িতে দেখেন স্থানীয় civil time হিসেবে। অন্যদিকে traditional astronomical engine কোনো reference meridian থেকে নিজের স্থানে গণনা স্থানান্তরের জন্য দেশান্তর correction ব্যবহার করতে পারে। এই দুই conversion-এর উদ্দেশ্য আলাদা।

বিভ্রান্তি কোথায় তৈরি হয়?

দ্রাঘিমা ও সময়ের সম্পর্ক থাকার কারণে deśāntara এবং time-zone offset দেখতে একই ধরনের সংখ্যা তৈরি করতে পারে। যেমন ১৫° longitude পার্থক্য পৃথিবীর দৈনিক ঘূর্ণনের হিসাবে প্রায় এক ঘণ্টা। Time zone-ও প্রায়ই এক ঘণ্টার ধাপে প্রকাশ করা হয়। কিন্তু তাদের উৎস ও ব্যবহার এক নয়।

  • Deśāntara: একটি astronomical model-এর reference meridian থেকে locality correction;
  • Time zone: রাষ্ট্র বা প্রশাসন নির্ধারিত civil clock rule;
  • DST: কোনো সময় অঞ্চলের seasonal legal clock shift;
  • Local mean solar time: স্থানীয় দ্রাঘিমার mean Sun-ভিত্তিক সময়;
  • Apparent solar time: বাস্তব সূর্যের hour angle-ভিত্তিক সময়, যেখানে equation of time-এর প্রভাব থাকে।

একটি app যদি traditional engine-এ longitude correction দেয় এবং পরে সেই একই longitude difference আবার UTC offset হিসেবে যোগ করে, তবে correction দ্বিগুণ হয়ে যায়। বিপরীতভাবে, শুধু time-zone বদলে latitude/longitude না বদলালে sunrise ও lagna স্থানীয়ভাবে সঠিক হবে না।

পঞ্জিকায় ব্যবহৃত পাঁচ ধরনের সময়

সময়ের ধরন কিসের ভিত্তি পঞ্জিকায় ব্যবহার
UTC আন্তর্জাতিক continuous reference Event storage, comparison ও conversion anchor
Local mean solar time Observer-এর longitude ও mean Sun Longitude-based historical/locality analysis
Apparent solar time বাস্তব সূর্যের apparent motion True solar noon এবং equation-of-time research
Standard civil time আইনগত UTC offset ও zone rules ব্যবহারকারীর clock display
Daylight time Seasonal/political adjustment যেমন New York-এ EDT বনাম EST

UT1-কে Greenwich meridian-এর modern mean-solar-time form হিসেবে বিবেচনা করা হয়; UTC atomic time scale-এর সঙ্গে যুক্ত এবং leap seconds-এর মাধ্যমে পৃথিবীর rotation-এর কাছাকাছি রাখা হয়। সাধারণ calendar app-এ event instant UTC/JD-তে রাখা এবং display-এর সময় civil zone conversion করাই নিরাপদ।

দেশান্তর কী?

Deśāntara অর্থ স্থান বা longitude-এর পার্থক্য। Classical বা later karaṇa tradition-এ mean planetary places কোনো standard meridian বা reference locality-এর জন্য নির্ণীত হলে, observer-এর স্থানীয় meridian-এ একই stage-এর value পেতে locality correction প্রয়োজন হতে পারে।

সূর্যসিদ্ধান্তের অনুবাদে deśāntara correction দিয়ে লঙ্কার সূর্যোদয়ের জন্য rectified planetary places-কে প্রদত্ত স্থানের সূর্যোদয়ে স্থানান্তরের আলোচনা আছে। পরবর্তী Grahalāghava tradition-এর বিশ্লেষণে observer ও prime meridian-এর ব্যবধান থেকে Moon-এর mean longitude correction দেখানো হয়; Moon দ্রুত চলার কারণে ঐ নির্দিষ্ট পদ্ধতিতে correction-টি Moon-এর জন্য উল্লেখযোগ্য ধরা হয়েছে।

দেশান্তর কী নয়?

  • এটি UTC+05:30 বা UTC+06:00 নয়;
  • এটি DST-এর এক ঘণ্টা shift নয়;
  • এটি equation of time নয়;
  • এটি latitude correction নয়;
  • এটি সব গ্রহে একইভাবে প্রয়োগযোগ্য universal offset নয়।

এক ডিগ্রি longitude কেন প্রায় চার মিনিট?

পৃথিবী গড়ে ২৪ ঘণ্টায় ৩৬০° ঘোরে। তাই:

৩৬০° ÷ ২৪ ঘণ্টা = ১৫° প্রতি ঘণ্টা

৬০ মিনিট ÷ ১৫° = ৪ মিনিট প্রতি degree

Δtmean = (λlocal − λreference) × ৪ মিনিট

এই relation local mean solar time-এর geometric approximation। Apparent Sun-এর সঙ্গে clock-এর seasonal difference জানতে equation of time-ও প্রয়োজন। U.S. Naval Observatory-এর ব্যাখ্যা অনুযায়ী civil time শুধু time-zone defining meridian-এ—এবং daylight time না থাকলে—local mean solar time-এর ভালো approximation; অন্য longitude-এ প্রতি degree-তে প্রায় চার মিনিট পার্থক্য হয়।

কলকাতা, ঢাকা ও নিউইয়র্ক: তিনটি practical example

নিচের হিসাবগুলো modern civil-zone defining meridian-এর সঙ্গে local mean solar time-এর তুলনা। এগুলো classical deśāntara table-এর substitute নয়।

স্থান প্রায় longitude Standard meridian Mean-solar difference
কলকাতা 88.35° E 82.5° E (UTC+5:30) প্রায় +২৩ মিনিট ২৪ সেকেন্ড
ঢাকা 90.4125° E 90° E (UTC+6) প্রায় +১ মিনিট ৩৯ সেকেন্ড
New York City 74.006° W 75° W (EST, UTC−5) প্রায় +৩ মিনিট ৫৯ সেকেন্ড

New York-এর summer clock-এ EDT কার্যকর হলে civil clock আরও এক ঘণ্টা এগিয়ে যায়। সেই এক ঘণ্টা longitude থেকে আসে না; এটি daylight-saving rule। একই location-এর longitude সারা বছর অপরিবর্তিত থাকে, কিন্তু UTC offset ঋতুভেদে −৫ থেকে −৪ ঘণ্টা হতে পারে।

Reading the sign: উপরকার table-এ positive মানে স্থানীয় mean Sun standard-meridian mean Sun-এর তুলনায় এগিয়ে। Classical planetary correction-এর sign একই হবে—এমন অনুমান করা যাবে না; calculation কোন direction-এ transform করছে তার ওপর sign নির্ভর করে।

Sign convention আগে ঘোষণা করুন

Longitude data-তে east-positive convention ব্যবহার করলে:

East longitude = positive

West longitude = negative

Δλ = λlocal − λreference

Local mean-time offset = Δλ × ৪ মিনিট/degree

কিন্তু একটি planetary engine reference sunrise থেকে local sunrise-এ value আনছে, না local time থেকে reference time-এ ফিরিয়ে নিচ্ছে—তার ওপর angular correction যোগ বা বিয়োগ হতে পারে। তাই data model-এ শুধু Deshantara = 23.4 রাখলে চলবে না। নিচের metadata রাখা উচিত:

  • reference meridian longitude;
  • local longitude;
  • east-positive বা west-positive convention;
  • raw longitude difference;
  • time-equivalent difference;
  • correction কোন quantity-তে প্রয়োগ হয়েছে;
  • application sign এবং source rule;
  • unit—time minute, arcminute, ghaṭī বা internal unit।

সঠিক calculation pipeline

Stage করণীয় যা করবেন না
১. Astronomical input একটি canonical UTC/JD instant Unspecified local DateTime দিয়ে শুরু
২. Traditional calculation Source rule অনুযায়ী deśāntara UTC offset-কে deśāntara ধরা
৩. Event solution Root/event instant UTC/JD-তে প্রতি iteration-এ wall-clock round
৪. Civil conversion Zone rules দিয়ে UTC→local Fixed offset দিয়ে DST location
৫. Calendar rule Local sunrise/midnight boundaries UTC date-কে local panchanga date ধরা
৬. Display Zone ID, offset ও DST status শুধু “স্থানীয় সময়” লেখা

Sunrise, sunset, moonrise, lagna ও house calculation-এ latitude এবং longitude physical observer location হিসেবে ব্যবহৃত হয়। Time zone শুধু সেই event instant-এর clock label নির্ধারণ করে। একই coordinates রেখে শুধু zone বদলালে astronomical event অপরিবর্তিত থাকবে, কিন্তু display clock বদলবে; coordinates বদলালে event-ও বদলাতে পারে।

Early historical year-এর time policy

৫৯৪ খ্রিস্টাব্দে “India Standard Time”, “Bangladesh Standard Time” বা “Eastern Standard Time” ছিল না। আধুনিক zone rule প্রাচীন instant-এ চালিয়ে পাওয়া clock label একটি computational projection—ঐতিহাসিকভাবে ব্যবহৃত civil clock নয়।

IANA time-zone database বহু স্থানের modern civil-time history সংরক্ষণ করে, কিন্তু তার principal reliable scope ১৯৭০-পরবর্তী timestamps; আরও পুরোনো তথ্য অসম্পূর্ণ বা কম নির্ভরযোগ্য হতে পারে। Windows TimeZoneInfo-র historical rules-ও operating-system data-এর ওপর নির্ভর করে। তাই ancient reports-এ policy প্রকাশ করা জরুরি।

Policy Display উপযুক্ত ব্যবহার
Astronomical canonical JD/UTC + location coordinates সর্বোচ্চ reproducibility
Longitude-based LMT স্থানীয় mean solar time Standard-zone-পূর্ব historical research
Modern-zone projection বর্তমান zone convention-এ projected clock Modern reader convenience; label আবশ্যক
Documented historical civil time প্রামাণ্য local rule তথ্যসূত্র পাওয়া গেলে নির্দিষ্ট period

C# implementation: দুটি service, দুটি দায়িত্ব

১. Longitude-based mean-time difference

public sealed class LongitudeTimeDifference
{
    public double LocalLongitudeEast { get; set; }
    public double ReferenceLongitudeEast { get; set; }
    public double DifferenceDegrees { get; set; }
    public TimeSpan MeanSolarOffset { get; set; }
}

public static LongitudeTimeDifference MeanSolarDifference(
    double localLongitudeEast,
    double referenceLongitudeEast)
{
    if (localLongitudeEast < -180.0 || localLongitudeEast > 180.0)
        throw new ArgumentOutOfRangeException("localLongitudeEast");
    if (referenceLongitudeEast < -180.0 || referenceLongitudeEast > 180.0)
        throw new ArgumentOutOfRangeException("referenceLongitudeEast");

    double difference = localLongitudeEast - referenceLongitudeEast;

    LongitudeTimeDifference result = new LongitudeTimeDifference();
    result.LocalLongitudeEast = localLongitudeEast;
    result.ReferenceLongitudeEast = referenceLongitudeEast;
    result.DifferenceDegrees = difference;
    result.MeanSolarOffset = TimeSpan.FromMinutes(difference * 4.0);
    return result;
}

এই helper শুধু geometric mean-time difference দেয়। Classical planet-এ কোন sign-এ বা কোন unit-এ correction যাবে, সেটি source-specific engine method-এর কাজ।

২. UTC থেকে civil local time

public sealed class LocalClockResult
{
    public DateTime Utc { get; set; }
    public DateTime Local { get; set; }
    public TimeSpan UtcOffset { get; set; }
    public bool IsDaylightSaving { get; set; }
    public string TimeZoneId { get; set; }
}

public static LocalClockResult ToLocalClock(
    DateTime utc,
    string timeZoneId)
{
    DateTime canonicalUtc = DateTime.SpecifyKind(utc, DateTimeKind.Utc);
    TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
    DateTime local = TimeZoneInfo.ConvertTimeFromUtc(canonicalUtc, zone);

    LocalClockResult result = new LocalClockResult();
    result.Utc = canonicalUtc;
    result.Local = local;
    result.UtcOffset = zone.GetUtcOffset(canonicalUtc);
    result.IsDaylightSaving = zone.IsDaylightSavingTime(local);
    result.TimeZoneId = zone.Id;
    return result;
}

Windows/.NET Framework-এ project-এর পরিচিত IDs হতে পারে:

  • India Standard Time—কলকাতা;
  • Bangladesh Standard Time—ঢাকা;
  • Eastern Standard Time—New York; নামের মধ্যে “Standard” থাকলেও adjustment rules থাকলে DST conversion করে।

Server deployment-এর আগে available IDs যাচাই করুন; Windows এবং IANA identifiers এক নয়। Cross-platform code হলে explicit mapping বা একটি tested time-zone library প্রয়োজন।

৩. Local input থেকে UTC: ambiguous ও invalid time

DST শুরু হলে কিছু local clock time অস্তিত্বহীন; DST শেষ হলে একটি local time দুবার ঘটতে পারে। User যদি New York-এ শুধু “১:৩০ AM” দেন, date অনুযায়ী সেটি ambiguous হতে পারে।

public static DateTime LocalInputToUtc(
    DateTime localUnspecified,
    TimeZoneInfo zone)
{
    DateTime local = DateTime.SpecifyKind(
        localUnspecified,
        DateTimeKind.Unspecified);

    if (zone.IsInvalidTime(local))
        throw new ArgumentException(
            "নির্বাচিত local time DST পরিবর্তনের কারণে বিদ্যমান নেই।");

    if (zone.IsAmbiguousTime(local))
        throw new ArgumentException(
            "নির্বাচিত local time দুইবার ঘটে; UTC offset নির্বাচন করুন।");

    return TimeZoneInfo.ConvertTimeToUtc(local, zone);
}

Automated astronomical calculation সাধারণত local input ambiguity এড়াতে পারে: canonical JD/UTC instant solve করে তারপর local clock derive করুন। User-entered জন্মসময় বা গবেষণা-সময় হলে ambiguity validation অবশ্যই দরকার।

৪. Deśāntara trace model

public sealed class DeshantaraTrace
{
    public string SourceProfile { get; set; }
    public double ReferenceLongitudeEast { get; set; }
    public double LocalLongitudeEast { get; set; }
    public double DifferenceDegrees { get; set; }
    public string RawCorrection { get; set; }
    public string Unit { get; set; }
    public string AppliedTo { get; set; }
    public string SignRule { get; set; }
}

public sealed class TimeDisplayTrace
{
    public string TimeZoneId { get; set; }
    public string TimeZoneDatabaseVersion { get; set; }
    public TimeSpan UtcOffset { get; set; }
    public bool IsDaylightSaving { get; set; }
    public string HistoricalPolicy { get; set; }
}

দুটি trace আলাদা রাখলে XML/API consumer বুঝতে পারে কোন value astronomical model-এর এবং কোনটি civil display-এর।

Validation ও regression tests

  1. Longitude east-positive convention documented;
  2. −১৮০° থেকে +১৮০° range enforced;
  3. Reference meridian profile-specific;
  4. Δlongitude = local − reference tested;
  5. ১৫° difference = ১ ঘণ্টা;
  6. ১° difference = ৪ মিনিট;
  7. Deśāntara unit published;
  8. Deśāntara applied body/quantity published;
  9. Classical sign rule published;
  10. UTC offset never used as classical deśāntara;
  11. Deśāntara never applied twice;
  12. UTC/JD retained as canonical instant;
  13. DateTimeKind.Utc enforced for UTC conversion;
  14. Local input uses Unspecified kind;
  15. Invalid DST time rejected;
  16. Ambiguous DST time requires offset choice;
  17. New York winter offset tested;
  18. New York summer offset tested;
  19. Kolkata no-DST behavior tested;
  20. Dhaka no-DST behavior tested;
  21. Same UTC instant converts consistently;
  22. Same coordinates, different zone changes clock only;
  23. Different coordinates recalculate rise/set;
  24. Latitude is not used in mean longitude-time difference;
  25. Latitude remains required for sunrise;
  26. Equation of time not folded into longitude correction;
  27. Historical year does not silently claim modern zone;
  28. Pre-1970 zone result carries reliability/policy label;
  29. Julian/Gregorian labels map to same JD;
  30. Daily, monthly ও yearly pages use same conversion service;
  31. XML/API include zone ID and offset;
  32. Cache key includes zone ID and rules/version;
  33. Parallel calculations share no mutable zone state;
  34. Server and desktop results match for same rule data;
  35. Applied-rule trace retained.

সাধারণ ভুল ও তার ফল

ভুল ফল সমাধান
Time-zone offset-কে deśāntara ধরা Model correction ভুল Traditional ও civil service আলাদা
Longitude correction দুবার Event time কয়েক মিনিট/ঘণ্টা সরে যায় Canonical pipeline audit
DST zone-এ fixed offset বছরের অংশে এক ঘণ্টা ভুল Rule-aware zone conversion
Local DateTime-কে UTC ধরা Double conversion Kind ও source zone explicit
Ancient year-এ modern zone silent Historical claim বিভ্রান্তিকর JD/LMT বা projection label
Zone বদলে sunrise location বদলেছে ভাবা Physical event অপরিবর্তিত থাকে Coordinates ও clock rule আলাদা
West longitude positive/negative mix Correction বিপরীত দিকে East-positive input contract

উপসংহার

দেশান্তর, local mean solar time এবং civil time-zone—তিনটিরই longitude ও সময়ের সঙ্গে সম্পর্ক আছে, কিন্তু এগুলো পরস্পরের বিকল্প নয়। Deśāntara traditional astronomical model-এর locality correction; local mean time longitude-based solar clock; time zone ও DST আইনগত civil clock convention।

পঞ্জিকা software-এ event instant JD/UTC-তে canonical রাখুন। Traditional calculation-এর deśāntara source profile অনুযায়ী একবার প্রয়োগ করুন। এরপর TimeZoneInfo বা সমতুল্য rule-aware database দিয়ে user-facing local clock বের করুন। Early historical output-এ modern zone projection নীরবে ব্যবহার না করে JD, dual calendar date এবং declared LMT/time policy প্রকাশ করুন।

এই separation মানলে কলকাতা, ঢাকা ও নিউইয়র্ক—তিন location-এই একই codebase reliable থাকবে; DST, historical date এবং traditional calculation একে অন্যের ফল অজান্তে পরিবর্তন করবে না।

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

  1. Sūrya-Siddhānta translation—Deśāntara correction.
  2. Cidambi, Montelle & Plofker—Astronomical handbooks in 16th-century South Asia; prime meridian, ahargaṇa ও locality-difference correction.
  3. U.S. Naval Observatory—The Equation of Time; civil time, defining meridian এবং প্রতি degree-তে mean-solar difference.
  4. IANA Time Zone Database—Theory and pragmatics; civil-time history, database scope ও pre-1970 limitations.
  5. NIST—Local Time FAQs; UTC offsets, time zones ও daylight time.
  6. Microsoft Learn—TimeZoneInfo.ConvertTimeFromUtc; .NET Framework-compatible civil time conversion.

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