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

ঐতিহাসিক স্থানীয় সময়: Local Mean Time, Standard Time ও Time-Zone Database

ঐতিহাসিক পঞ্জিকায় Local Mean Time, apparent solar time, standard time, DST, IANA tz database, .NET TimeZoneInfo ও প্রাচীন local-date conversion-এর নির্দেশিকা।

“স্থানীয় সময়” একটি একক সর্বজনীন ধারণা নয়। সূর্যের actual অবস্থান থেকে apparent solar time, average Sun থেকে local mean time, আইন দ্বারা standard time এবং seasonal clock-change থেকে daylight time তৈরি হয়। Historical Panchanga software-এ কোন অর্থে “স্থানীয়” বলা হচ্ছে তা নির্দিষ্ট না করলে একই event-এর clock label ও civil date উভয়ই বদলে যেতে পারে।

একই স্থানের চারটি সময়

সময় ভিত্তি Uniform? ব্যবহার
Local Apparent Solar Time True Sun-এর meridian position না Sundial/actual solar noon
Local Mean Time—LMT Longitude + fictitious mean Sun Mean-day scale Pre-standard-time research convention
Local Standard Time আইনগত zone offset Zone-এর মধ্যে এক Civil clock
Daylight/Summer Time Standard time + seasonal rule Political rule Seasonal civil clock

এই চারটির সঙ্গে UT1, UTC ও TT-ও গুলিয়ে ফেলা যাবে না। UT1 পৃথিবীর rotation-based Greenwich reference; TT ephemeris calculation-এর uniform scale; UTC আধুনিক civil reference। Local-time layer এগুলোর ওপর পরে বসে।

Local Mean Time কী?

পৃথিবী ২৪ ঘণ্টায় প্রায় ৩৬০° ঘোরে। তাই ১৫° longitude difference প্রায় ১ ঘণ্টা এবং ১° প্রায় ৪ মিনিট সময়ের সমান। পূর্ব longitude positive এবং পশ্চিম longitude negative ধরলে:

LMT offset hours = longitude ÷ 15

LMT offset seconds = longitude × 240

LMT = UT1 + longitude-based offset

এই প্রকল্পে ব্যবহৃত longitude ধরে illustrative offsets:

স্থান Longitude Geometric LMT offset Modern civil offset-এর সঙ্গে তুলনা
ঢাকা 90.4125° E +06:01:39 বর্তমান +06:00 থেকে ১মি ৩৯সে এগিয়ে
কলকাতা 88°21′ E +05:53:24 বর্তমান +05:30 থেকে ২৩মি ২৪সে এগিয়ে
নিউইয়র্ক প্রায় 74.006° W −04:56:01 Modern standard/daylight offset-এর সমান নয়

এগুলো longitude থেকে গণিতগতভাবে পাওয়া research offsets; কোনো নির্দিষ্ট যুগে জনসাধারণ সত্যিই এই clock ব্যবহার করতেন—এমন historical দাবি নয়। Location-এর longitude বদলালে LMT বদলায়; modern zone-এর মতো একটি পুরো অঞ্চলে একই LMT থাকে না।

Longitude convention পরীক্ষা করুন

কিছু library east-positive, কিছু west-positive ব্যবহার করতে পারে। Formula copy করার আগে sign convention test করুন:

  • Greenwich 0° → 00:00 offset;
  • 15° E → +01:00;
  • 15° W → −01:00;
  • 90° E → +06:00;
  • 180° → ±12:00 boundary policy।

Apparent solar time LMT নয়

True Sun আকাশে uniform rate-এ চলে না। পৃথিবীর orbit-এর eccentricity ও axial tilt-এর কারণে sundial time এবং mean solar time-এর মধ্যে seasonal difference হয়। এই difference-কে Equation of Time বলা হয়:

Equation of Time = Apparent Solar Time − Mean Solar Time

Local Apparent Solar Time = LMT + Equation of Time

Equation of Time বছরে পরিবর্তিত হয় এবং প্রায় ১৬ মিনিট পর্যন্ত পৌঁছাতে পারে। অতএব “সূর্য যখন মাথার ওপর/meridian-এ, তখন clock 12:00”—এটি apparent solar time-এর বক্তব্য; LMT বা standard clock-এ solar noon ঠিক 12:00 হওয়া বাধ্যতামূলক নয়।

Standard Time ও DST রাজনৈতিক নিয়ম

Standard time একটি অঞ্চলকে একটি common clock দেয়। তাত্ত্বিকভাবে ১৫° longitude-wide zone এক ঘণ্টা offset-এর সঙ্গে সম্পর্কিত হলেও বাস্তব zone boundary আইন, প্রশাসন, পরিবহন ও রাজনীতির কারণে অনিয়মিত। Half-hour ও quarter-hour offsets-ও রয়েছে।

DST standard offset-এর ওপর seasonal পরিবর্তন। এর start/end date ইতিহাসে বহুবার বদলেছে। তাই:

  • শুধু “UTC−5” লিখলে New York-এর summer time বোঝা যায় না;
  • শুধু “Eastern Standard Time” ID-র display name দেখে ঐতিহাসিক rule অনুমান করা যাবে না;
  • বর্তমান DST rule অতীতের সব বছরে প্রয়োগ করা যাবে না;
  • Future government change-এর কারণে আগাম conversion stale হতে পারে।

Named zone-এর উদ্দেশ্য শুধু বর্তমান offset নয়; date অনুযায়ী transition rule নির্বাচন করা। কিন্তু database coverage-এর সীমা বুঝতে হবে।

IANA Time Zone Database কী জানে—এবং কী জানে না?

IANA tz database civil time ও DST transition history record করার চেষ্টা করে। এর প্রধান design scope হলো এমন geographical regions আলাদা করা যাদের clocks ১৯৭০ সালের পর একমত। Pre-1970 transition রাখা হলেও database নিজেই সতর্ক করে যে সব স্থান ও সব অতীত সময়ের নির্ভুল ইতিহাসের জন্য এটি যথেষ্ট নয়।

গুরুত্বপূর্ণ সীমাবদ্ধতা

  • Database authoritative legal archive নয়;
  • Pre-1970 data অনেক ক্ষেত্রে incomplete বা uncertain;
  • একটি zone-এর early data named city-এর বাইরে পুরো region-এর জন্য সত্য নাও হতে পারে;
  • Historical region boundary সবসময় সংরক্ষিত নয়;
  • Transition বাস্তবে ধীরে ঘটলেও data instantaneous change হিসেবে model করতে পারে;
  • Database uncertainty metadata প্রকাশ করে না;
  • LMT entries-কে historical fact হিসেবে ধরা উচিত নয়;
  • Future political rules বদলালে database update দরকার।

Asia/Kolkata, Asia/Dhaka বা America/New_York modern calculation-এর জন্য উপযোগী। কিন্তু ৫৯৪ খ্রিস্টাব্দে এগুলোর returned offset পেলে সেটিকে “তৎকালীন সরকারি সময়” বলা যাবে না। এটি software database-এর proleptic/backfilled representation হতে পারে।

Abbreviation ব্যবহার করবেন না

IST India, Ireland অথবা Israel বোঝাতে পারে; CST China বা North American Central Time বোঝাতে পারে। Storage ও API-তে named zone ID এবং numeric offset দুটিই রাখুন; abbreviation শুধু display-এর জন্য।

Historical local-time policy নির্বাচন

Policy কখন ব্যবহার করবেন Label
Named civil zone Reliable documented period “স্থানীয় নাগরিক সময়”
Documented historical offset আইন/observatory/source জানা Source ও effective dates সহ
Longitude-based LMT Pre-standard-time research reconstruction “গণনাকৃত LMT”
Fixed project offset Series consistency/modern-reader display “প্রকল্পীয় fixed offset”
UT1 only Local history অত্যন্ত অনিশ্চিত “UT1; local clock অনির্ধারিত”

একটি প্রকল্প একাধিক view দিতে পারে: primary research view-এ UT1 ও LMT, modern-reader view-এ proleptic Gregorian date এবং fixed modern offset। তবে প্রতিটি view-এর label স্পষ্ট হতে হবে; একটিকে অন্যটির historical replacement বলা যাবে না।

প্রস্তাবিত যুগভিত্তিক policy

  1. Modern period: named zone database + date-specific DST;
  2. Documented standard-time period: verified historical transition/offset;
  3. Pre-standard-time period: longitude-based LMT or UT1;
  4. Ancient reconstruction: UT1 primary, declared LMT secondary, modern zone projection optional;
  5. Unknown history: do not invent offset—return indeterminate/local-policy-required।

পঞ্জিকা গণনায় কোন সময় কোথায়?

গণনা মূল instant/scale Local layer
Planet/Sun/Moon longitude TT/ephemeris time সাধারণত নেই
সংক্রান্তি exact instant TT root → UT1 Display ও rule comparison
Sunrise/sunset UT1 + observer coordinates Civil/LMT clock label
Lagna/houses UT1/sidereal time + longitude Input instant interpretation
বাংলা মাসের প্রথম দিন Event + sunrise/midnight Chosen local-day policy critical
Public clock display Resolved instant Named zone/LMT/fixed policy

Local clock offset দিয়ে sunrise instant তৈরি করবেন না। Sunrise astronomical geometry থেকে solve হবে; তারপর chosen policy দিয়ে clock label তৈরি হবে। একইভাবে সংক্রান্তি TT-তে solve করে UT1-এ convert করার পরে local midnight-এর সঙ্গে তুলনা করুন।

C#/.NET Framework implementation

LMT offset calculation

static TimeSpan LongitudeToLocalMeanOffset(double longitudeEast)
{
    if (Double.IsNaN(longitudeEast) ||
        Double.IsInfinity(longitudeEast) ||
        longitudeEast < -180.0 || longitudeEast > 180.0)
        throw new ArgumentOutOfRangeException("longitudeEast");

    double totalSeconds = longitudeEast * 240.0;
    return TimeSpan.FromSeconds(totalSeconds);
}

TimeSpan tick precision থাকলেও historical longitude-এর precision সেই মাত্রার নাও হতে পারে। Display-এ source coordinate অনুযায়ী sensible rounding করুন।

Policy-bearing result

public enum LocalClockPolicy
{
    NamedCivilZone,
    DocumentedHistoricalOffset,
    LongitudeLocalMeanTime,
    FixedProjectOffset,
    Ut1Only
}

public sealed class LocalClockResult
{
    public LocalClockPolicy Policy { get; set; }
    public DateTime LocalDateTime { get; set; }
    public TimeSpan OffsetFromUt { get; set; }
    public string ZoneId { get; set; }
    public string Source { get; set; }
    public bool IsHistoricalProjection { get; set; }
    public string Warning { get; set; }
}

Named-zone conversion

static LocalClockResult ConvertModernUtc(
    DateTime utc,
    string windowsTimeZoneId)
{
    if (utc.Kind != DateTimeKind.Utc)
        throw new ArgumentException("UTC DateTime is required.");

    TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(
        windowsTimeZoneId);
    DateTime local = TimeZoneInfo.ConvertTimeFromUtc(utc, zone);
    TimeSpan offset = zone.GetUtcOffset(utc);

    return new LocalClockResult
    {
        Policy = LocalClockPolicy.NamedCivilZone,
        LocalDateTime = local,
        OffsetFromUt = offset,
        ZoneId = zone.Id,
        Source = "Operating-system time-zone data",
        IsHistoricalProjection = false
    };
}

.NET Framework on Windows সাধারণত Windows time-zone IDs ব্যবহার করে—যেমন India Standard Time, Bangladesh Standard Time ও Eastern Standard Time। IANA IDs সরাসরি গ্রহণ করবে ধরে নেবেন না। Cross-platform/service layer-এ mapping বা dedicated time library লাগতে পারে।

Ancient LMT projection

static LocalClockResult ConvertUt1ToLmt(
    DateTime ut1Like,
    double longitudeEast,
    string coordinateSource)
{
    TimeSpan offset = LongitudeToLocalMeanOffset(longitudeEast);
    DateTime local = ut1Like + offset;

    return new LocalClockResult
    {
        Policy = LocalClockPolicy.LongitudeLocalMeanTime,
        LocalDateTime = local,
        OffsetFromUt = offset,
        ZoneId = null,
        Source = coordinateSource,
        IsHistoricalProjection = true,
        Warning = "Longitude-derived LMT; not a claim of legal civil time."
    };
}

প্রাচীন JD যদি DateTime-এ নিরাপদে represent না হয়, calendar fields-এর custom structure ব্যবহার করুন এবং JD-তে offset যোগ করুন:

static double ApplyOffsetToJulianDay(
    double jdUt1,
    TimeSpan offset)
{
    return jdUt1 + offset.TotalSeconds / 86400.0;
}

Ambiguous ও invalid local time

DST শুরুতে clock সামনে যাওয়ায় কিছু local time কখনও ঘটে না—এগুলো invalid। DST শেষে clock পিছিয়ে যাওয়ায় কিছু wall time দুইবার ঘটে—এগুলো ambiguous। User যদি local birth/event time দেন, zone conversion-এর আগে পরীক্ষা করুন:

static void ValidateLocalWallTime(
    DateTime unspecifiedLocal,
    TimeZoneInfo zone)
{
    DateTime local = DateTime.SpecifyKind(
        unspecifiedLocal,
        DateTimeKind.Unspecified);

    if (zone.IsInvalidTime(local))
        throw new ArgumentException(
            "The local time does not exist because of a clock transition.");

    if (zone.IsAmbiguousTime(local))
        throw new ArgumentException(
            "The local time occurs twice; an offset choice is required.");
}

Ambiguous time silently একটি offset বেছে নেওয়া উচিত নয়। UI-তে “আগের offset” ও “পরের offset” দেখিয়ে user/source থেকে নির্বাচন নিন। Astronomical engine থেকে UTC/UT1 instant পাওয়া থাকলে সমস্যা কম: instant → local conversion সাধারণত unambiguous, যদিও একই wall-clock label পুনরাবৃত্ত হতে পারে।

HTML, XML ও API-তে metadata

Human-readable label

<div class="historical-time-note">
  স্থানীয় সময়: 05:53:24 LMT
  <small>88°21′ পূর্ব longitude থেকে গণিতগতভাবে নির্ণীত;
  ঐতিহাসিক সরকারি সময়ের দাবি নয়।</small>
</div>

Research XML

<local_time
    policy="longitude-lmt"
    longitude_east="88.350000"
    offset_seconds="21204"
    zone_id=""
    historical_projection="true"
    coordinate_source="project-location-table" />

API fields

  • instant.jdUt1 ও instant.jdTt;
  • localTime.policy;
  • localTime.offsetSeconds;
  • localTime.zoneId;
  • localTime.tzdbVersion বা OS rule version;
  • localTime.isHistoricalProjection;
  • localTime.source ও warning;
  • calendarMode—Julian/Gregorian/proleptic Gregorian।

Offset এবং zone ID দুটিই দরকার। Offset বলে instant-এ clock কত সরে গেছে; zone ID বলে কোন rule-set ব্যবহার করা হয়েছে। একই zone-এর offset season ও history অনুযায়ী বদলাতে পারে।

Validation checklist

  1. Longitude sign convention documented;
  2. 0° longitude gives zero LMT offset;
  3. 15° E gives +01:00;
  4. 15° W gives −01:00;
  5. 90° E gives +06:00;
  6. Longitude range validated;
  7. Seconds-per-degree equals 240;
  8. LMT calculation uses UT1-like reference;
  9. LMT not labeled standard time;
  10. LMT not labeled legal civil time;
  11. Apparent solar time separated from LMT;
  12. Equation-of-Time sign documented;
  13. Solar noon not forced to 12:00 standard time;
  14. Named zone used for modern dates;
  15. Date-specific DST rule applied;
  16. Fixed offset not substituted for named zone;
  17. Zone abbreviation not used as identifier;
  18. Windows/IANA ID distinction handled;
  19. Time-zone database version recorded;
  20. OS update dependency documented;
  21. Pre-1970 limitations disclosed;
  22. Ancient zone output marked projection;
  23. Authoritative legal source preferred when available;
  24. Historical offset effective dates stored;
  25. Coordinate source stored;
  26. Coordinate precision not overstated;
  27. Invalid DST wall time rejected;
  28. Ambiguous DST wall time requires choice;
  29. UTC-to-local conversion starts with UTC Kind;
  30. Unspecified local input explicitly marked;
  31. Local-to-UTC round trip tested;
  32. Offset-at-instant stored;
  33. Zone ID stored separately;
  34. UT1 and UTC not silently treated identical historically;
  35. ΔT handled before local-time layer;
  36. Event solver remains in declared time scale;
  37. Sunrise solved astronomically;
  38. Sunrise not derived from clock offset alone;
  39. Midnight threshold uses selected local policy;
  40. Policy change triggers month-start regression test;
  41. Dhaka LMT arithmetic verified;
  42. Kolkata LMT arithmetic verified;
  43. New York west-longitude sign verified;
  44. Julian/Gregorian label independent of zone;
  45. Date crossing after offset tested;
  46. Negative-year/custom-date path tested if supported;
  47. HTML warning visible;
  48. XML/API policy machine-readable;
  49. Unknown local history returns null/indeterminate;
  50. Published result reproducible from stored policy।

সাধারণ ভুল ও সমাধান

ভুল ফল সমাধান
Modern +05:30 সব historical Kolkata date-এ Anachronistic clock Documented offset বা LMT policy
Longitude correction = apparent solar time Equation-of-Time বাদ LMT ও apparent time আলাদা
IST দিয়ে zone নির্বাচন Ambiguous region Named zone ID
Fixed UTC offset দিয়ে DST city Seasonal এক ঘণ্টার ভুল Date-aware zone rules
tzdb pre-1970 result-কে authoritative বলা False historical claim Source validation ও warning
Ambiguous local time silently convert দুটি instant-এর একটিকে ভুল বাছাই Offset choice চাইুন
Local clock দিয়ে astronomy solve DST/offset contamination UT1/TT instant প্রথমে
Unknown offset-কে zero করা Misleading Greenwich time Null/UT1-only status

উপসংহার

Local Mean Time longitude থেকে গাণিতিকভাবে নির্ণীত mean-solar clock; apparent solar time true Sun ও Equation of Time-এর সঙ্গে সম্পর্কিত; standard time ও DST আইনি-রাজনৈতিক civil rules। এগুলো পরস্পরের বিকল্প নাম নয়।

IANA বা operating-system time-zone data modern calculation-এর জন্য অপরিহার্য হলেও গভীর historical period-এর সর্বত্র authoritative record নয়। Pre-standard বা ancient date-এ named zone থেকে একটি offset পাওয়া মানেই সেই যুগের মানুষ সেই clock ব্যবহার করতেন—এমন সিদ্ধান্ত গ্রহণ করা যাবে না।

সূর্য সিদ্ধান্ত পঞ্জিকা প্রকল্পে তাই event প্রথমে TT/UT1 instant হিসেবে solve করা, পরে declared local-time policy প্রয়োগ করা এবং output-এ policy, offset, source ও projection warning সংরক্ষণ করাই নিরাপদ পদ্ধতি। এতে ৫৯৪ খ্রিস্টাব্দের reconstruction এবং আধুনিক ঢাকা–কলকাতা–নিউইয়র্ক calculation একই architecture-এ থেকেও নিজ নিজ ঐতিহাসিক সীমা স্পষ্ট রাখে।

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

  1. IANA tzdb—Theory and pragmatics; scope, identifiers, LMT convention এবং pre-1970 accuracy limitations.
  2. IANA—Time Zone Database; current database releases ও maintenance.
  3. U.S. Naval Observatory—The Equation of Time; apparent ও mean solar time.
  4. NIST—Local Time FAQs; standard zones ও DST overview.
  5. NIST—Everyday Time and Atomic Time, Part 4; longitude, mean solar time ও local noon.
  6. Microsoft Learn—TimeZoneInfo; .NET Framework zone conversion API.
  7. Microsoft Learn—TimeZoneInfo.IsAmbiguousTime; repeated local wall times.
  8. Microsoft Learn—TimeZoneInfo.IsInvalidTime; skipped local wall times.

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