תיאום אירועים גלובליים באמצעות Temporal

תכונות באינטרנט: Temporal

קשה מאוד לתזמן אירועים באזורי זמן שונים באמצעות האובייקט Date מהדור הקודם, במיוחד במעבר לשעון קיץ (DST) כשאפשר לדלג על שעות או לחזור עליהן.

‫Temporal API מספק את Temporal.ZonedDateTime כדי לייצג תאריך ושעה באזור זמן ספציפי, ומטפל במעברים של שעון קיץ באופן אוטומטי וצפוי.

איך להטמיע

כדי לתאם אירועים גלובליים ולטפל בהתנגשויות פוטנציאליות של שעון קיץ:

  1. חובה: יצירת ZonedDateTime: משתמשים ב-Temporal.ZonedDateTime.from() כדי ליצור אובייקט של תאריך ושעה שכולל אזור זמן.
  2. חובה: טיפול במקרים לא ברורים: משתמשים באפשרות disambiguation כדי לשלוט בהתנהגות כשהשעה לא ברורה או לא קיימת (למשל, במהלך שינויים בשעון).
  3. חובה: המרת אזורי זמן: משתמשים ב-.withTimeZone() כדי לראות את השעה המקבילה במיקום אחר.

דוגמה: תזמון וזיהוי התנגשויות

// 1. Define the event time and target time zone
const date = "2025-03-09";
const time = "02:30"; // This time is skipped in New York during Spring Forward
const timeZone = "America/New_York";
const inputStr = `${date}T${time}[${timeZone}]`;

// 2. Detect conflicts using 'reject'
let hasConflict = false;
try {
  // 'reject' throws RangeError if the time is ambiguous or does not exist
  Temporal.ZonedDateTime.from(inputStr, { disambiguation: 'reject' });
} catch (e) {
  if (e instanceof RangeError) {
    hasConflict = true;
    console.log("This time falls in a DST transition gap or overlap.");
  }
}

// 3. Resolve the time safely using 'compatible' (default)
// 'compatible' will resolve to a valid time even if skipped or repeated
const hostTime = Temporal.ZonedDateTime.from(inputStr, { disambiguation: 'compatible' });
console.log(`Resolved time: ${hostTime.toString()}`);

// 4. Convert to another time zone (e.g., Tokyo)
const tokyoTime = hostTime.withTimeZone("Asia/Tokyo");
// Use toLocaleString() for user-facing display instead of manual hour/minute padding
console.log(`Tokyo time: ${tokyoTime.toLocaleString('en-US', { hour: 'numeric', minute: '2-digit' })}`);

הטמעה אסטרטגית ושיטות מומלצות

  • מומלץ להשתמש ב-Temporal.ZonedDateTime לאירועים שקשורים למיקום גיאוגרפי ספציפי (כמו פגישה בעיר מסוימת).
  • מומלץ להשתמש ב-disambiguation: 'reject' אם אתם צריכים לזהות התנגשויות בלוח הזמנים ולהזהיר את המשתמשים לגביהן במהלך המעבר לשעון קיץ.
  • מומלץ להשתמש ב-disambiguation: 'compatible' (ברירת המחדל) כשרוצים שהמערכת תבחר באופן אוטומטי זמן הגיוני כשיש התנגשויות.
  • אל תשתמשו ב-Temporal.PlainDateTime לאירועים גלובליים, כי הוא לא כולל מידע על אזור הזמן ולא יכול להביא בחשבון שינויים בשעון הקיץ.
  • מומלץ להשתמש ב-.withTimeZone() כדי לחשב את הזמן המקביל במיקומים אחרים בלי לשנות את האובייקט המקורי (אובייקטים זמניים לא ניתנים לשינוי).
  • מומלץ להשתמש בעיצוב מקורי של .toLocaleString() (כמו { hour: 'numeric', minute: '2-digit' }) לתצוגות זמן שגלויות למשתמשים, במקום חישובי זמן ידניים וריפוד.

אסטרטגיית גיבוי

תמיכה ב-Temporal בדפדפנים ופתרונות חלופיים

בדפדפנים שעדיין לא תומכים ב-API המקורי של Temporal, צריך להשתמש בזיהוי תכונות ולטעון באופן דינמי את temporal-polyfill (‎~15 KB min+gz).

חשוב לזכור שייבוא של temporal-polyfill לא מקצה באופן אוטומטי את האובייקט Temporal להיקף הגלובלי. אם הקוד שלכם מסתמך על globalThis.Temporal, צריך להקצות אותו באופן מפורש.

// Check if Temporal is supported natively
(async () => {
  if (typeof Temporal === 'undefined') {
    // Load the polyfill conditionally
    const module = await import('https://esm.sh/temporal-polyfill');
    globalThis.Temporal = module.Temporal;
    // Extend Date.prototype if needed
    Date.prototype.toTemporalInstant = module.toTemporalInstant;
  }
  initializeApp();
})();