עברית

מדריך מקיף ל-JavaScript Temporal API, פתרון מודרני לטיפול יעיל בתאריכים וזמנים בהקשרים בינלאומיים מגוונים.

JavaScript Temporal API: טיפול מודרני בתאריכים וזמנים לקהל גלובלי

אובייקט ה-`Date` של JavaScript היווה מקור לתסכול עבור מפתחים במשך זמן רב. היותו ניתן לשינוי (mutable), ה-API הלא עקבי שלו, והתמיכה הלקויה באזורי זמן הובילו ליצירת ספריות רבות כמו Moment.js ו-date-fns כדי למלא את החסר. כעת, עם ה-Temporal API, JavaScript מציעה פתרון מובנה ומודרני לטיפול בתאריכים וזמנים עם בהירות ודיוק משופרים. מאמר זה מספק סקירה מקיפה של ה-Temporal API, תוך התמקדות בתכונותיו, יתרונותיו, ושימושיו בהקשרים בינלאומיים מגוונים.

מהו ה-Temporal API?

ה-Temporal API הוא אובייקט גלובלי חדש ב-JavaScript שנועד לטפל בחסרונות של אובייקט ה-`Date`. הוא מספק API נקי ובלתי משתנה (immutable) לעבודה עם תאריכים, זמנים, אזורי זמן ומערכות לוח שנה. באופן מכריע, הוא שואף לייצג מושגים של תאריך ושעה באופן שמתיישר טוב יותר עם השימוש והציפיות בעולם האמיתי, מה שהופך את הבינאום (internationalization) להרבה יותר פשוט.

תכונות מרכזיות:

אובייקטי Temporal בסיסיים

ה-Temporal API מציג מספר סוגי אובייקטים חדשים. הנה כמה מהמרכזיים שבהם:

עבודה עם תאריכים

יצירת `Temporal.PlainDate`

כדי ליצור `Temporal.PlainDate`, ניתן להשתמש בבנאי (constructor):

const plainDate = new Temporal.PlainDate(2024, 10, 27); // שנה, חודש (1-12), יום
console.log(plainDate.toString()); // פלט: 2024-10-27

אפשר גם להשתמש במתודה `from`, שמקבלת מחרוזת בפורמט ISO 8601:

const plainDateFromString = Temporal.PlainDate.from('2024-10-27');
console.log(plainDateFromString.toString()); // פלט: 2024-10-27

קבלת רכיבי תאריך

ניתן לגשת לרכיבי תאריך בודדים באמצעות מאפיינים כמו `year`, `month`, ו-`day`:

console.log(plainDate.year); // פלט: 2024
console.log(plainDate.month); // פלט: 10
console.log(plainDate.day); // פלט: 27

חשבון תאריכים

כדי להוסיף או להחסיר ימים, שבועות, חודשים או שנים, השתמשו במתודות `plus` ו-`minus`. מתודות אלו מחזירות אובייקט `Temporal.PlainDate` חדש:

const nextWeek = plainDate.plus({ days: 7 });
console.log(nextWeek.toString()); // פלט: 2024-11-03

const lastMonth = plainDate.minus({ months: 1 });
console.log(lastMonth.toString()); // פלט: 2024-09-27

השוואת תאריכים

ניתן להשוות תאריכים באמצעות המתודה `compare`:

const date1 = new Temporal.PlainDate(2024, 10, 27);
const date2 = new Temporal.PlainDate(2024, 11, 15);

console.log(Temporal.PlainDate.compare(date1, date2)); // פלט: -1 (date1 מוקדם מ-date2)

עבודה עם זמנים

יצירת `Temporal.PlainTime`

כדי ליצור `Temporal.PlainTime`, השתמשו בבנאי:

const plainTime = new Temporal.PlainTime(10, 30, 0); // שעה, דקה, שנייה
console.log(plainTime.toString()); // פלט: 10:30:00

או השתמשו במתודה `from` עם מחרוזת זמן בפורמט ISO 8601:

const plainTimeFromString = Temporal.PlainTime.from('10:30:00');
console.log(plainTimeFromString.toString()); // פלט: 10:30:00

קבלת רכיבי זמן

console.log(plainTime.hour); // פלט: 10
console.log(plainTime.minute); // פלט: 30
console.log(plainTime.second); // פלט: 0

חשבון זמנים

const later = plainTime.plus({ minutes: 15 });
console.log(later.toString()); // פלט: 10:45:00

עבודה עם תאריך ושעה יחד

יצירת `Temporal.PlainDateTime`

ניתן ליצור `Temporal.PlainDateTime` ישירות או על ידי שילוב של `Temporal.PlainDate` ו-`Temporal.PlainTime`:

const plainDateTime = new Temporal.PlainDateTime(2024, 10, 27, 10, 30, 0);
console.log(plainDateTime.toString()); // פלט: 2024-10-27T10:30:00

const date = new Temporal.PlainDate(2024, 10, 27);
const time = new Temporal.PlainTime(10, 30, 0);
const combinedDateTime = date.toPlainDateTime(time);
console.log(combinedDateTime.toString()); // פלט: 2024-10-27T10:30:00

אזורי זמן

טיפול נכון באזורי זמן הוא חיוני עבור יישומים המתמודדים עם משתמשים במיקומים שונים. ה-Temporal API מספק תמיכה חזקה באזורי זמן באמצעות האובייקטים `Temporal.ZonedDateTime` ו-`Temporal.TimeZone`.

יצירת `Temporal.ZonedDateTime`

כדי ליצור `Temporal.ZonedDateTime`, אתם צריכים `Temporal.PlainDateTime` ומזהה אזור זמן. מזהי אזורי זמן מבוססים על מסד הנתונים של IANA (למשל, `America/Los_Angeles`, `Europe/London`, `Asia/Tokyo`).

const plainDateTime = new Temporal.PlainDateTime(2024, 10, 27, 10, 30, 0);
const timeZone = 'America/Los_Angeles';
const zonedDateTime = plainDateTime.toZonedDateTime(timeZone);
console.log(zonedDateTime.toString()); // פלט: 2024-10-27T10:30:00-07:00[America/Los_Angeles] (ההיסט יהיה תלוי בחוקי שעון קיץ)

לחלופין, ניתן ליצור `Temporal.ZonedDateTime` מתוך `Instant`.

const instant = Temporal.Instant.fromEpochSeconds(1666866600); // חותמת זמן לדוגמה
const zonedDateTimeFromInstant = instant.toZonedDateTimeISO(timeZone); // אזור זמן כמו 'America/Los_Angeles'
console.log(zonedDateTimeFromInstant.toString());

המרת בין אזורי זמן

ניתן להמיר `Temporal.ZonedDateTime` לאזור זמן אחר באמצעות המתודה `withTimeZone`:

const newTimeZone = 'Europe/London';
const zonedDateTimeInLondon = zonedDateTime.withTimeZone(newTimeZone);
console.log(zonedDateTimeInLondon.toString()); // פלט: 2024-10-27T18:30:00+01:00[Europe/London]

עבודה עם היסטים (offsets) של אזורי זמן

המתודה `getOffsetStringFor` של אובייקט `Temporal.TimeZone` מספקת את מחרוזת ההיסט עבור `Temporal.Instant` נתון:

const timeZoneObject = new Temporal.TimeZone(timeZone);
const offsetString = timeZoneObject.getOffsetStringFor(zonedDateTime.toInstant());
console.log(offsetString); // פלט: -07:00 (תלוי בחוקי שעון קיץ)

חיוני להשתמש במזהי אזור הזמן הנכונים של IANA לחישובים מדויקים. מזהים אלה מתוחזקים ומתעדכנים באופן קבוע כדי לשקף שינויים בשעון קיץ ובגבולות אזורי הזמן.

משכי זמן (Durations)

אובייקט `Temporal.Duration` מייצג פרק זמן. ניתן להשתמש בו כדי להוסיף או להחסיר מתאריכים וזמנים.

יצירת `Temporal.Duration`

ניתן ליצור `Temporal.Duration` באמצעות הבנאי, תוך ציון שנים, חודשים, ימים, שעות, דקות, שניות, מילי-שניות, מיקרו-שניות וננו-שניות:

const duration = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 8, 9); // שנים, חודשים, ימים, שעות, דקות, שניות, מילי-שניות, מיקרו-שניות, ננו-שניות
console.log(duration.toString()); // פלט: P1Y2M3DT4H5M6.007008009S

או באמצעות מחרוזת משך זמן בפורמט ISO 8601:

const durationFromString = Temporal.Duration.from('P1Y2M3DT4H5M6S');
console.log(durationFromString.toString()); // פלט: P1Y2M3DT4H5M6S

הוספת משכי זמן לתאריכים וזמנים

const plainDate = new Temporal.PlainDate(2024, 10, 27);
const duration = new Temporal.Duration(0, 0, 7); // 7 ימים
const newDate = plainDate.plus(duration);
console.log(newDate.toString()); // פלט: 2024-11-03

שימו לב שהוספת משכי זמן הכוללים חודשים או שנים לתאריכים דורשת שיקול דעת, שכן מספר הימים בחודש או בשנה יכול להשתנות.

מערכות לוח שנה

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

שימוש בלוחות שנה חלופיים

כדי להשתמש בלוח שנה ספציפי, ניתן לציין אותו בעת יצירת אובייקטי Temporal:

const hebrewDate = new Temporal.PlainDate(5785, 1, 1, { calendar: 'hebrew' });
console.log(hebrewDate.toString()); // הפלט הספציפי עשוי להשתנות בהתאם למימוש ולעיצוב. דורש פוליפיל בסביבות רבות נכון לכתיבת שורות אלה.

חשוב: תמיכה בלוחות שנה שאינם גרגוריאניים עשויה לדרוש פוליפילים (polyfills) או תמיכה ספציפית של דפדפן/סביבה. בדקו את טבלאות תאימות הדפדפנים ואת התיעוד של ה-Temporal API לקבלת המידע העדכני ביותר.

עיצוב תאריכים וזמנים

בעוד שה-Temporal API מתמקד במניפולציה של תאריכים וזמנים, עיצוב (formatting) מטופל בדרך כלל על ידי אובייקט `Intl.DateTimeFormat`, שהוא חלק מה-Internationalization API. אובייקטי Temporal עובדים בצורה חלקה עם `Intl.DateTimeFormat`.

שימוש ב-`Intl.DateTimeFormat`

כך ניתן לעצב `Temporal.PlainDate` באמצעות `Intl.DateTimeFormat`:

const plainDate = new Temporal.PlainDate(2024, 10, 27);
const formatter = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric' });
console.log(formatter.format(plainDate)); // פלט: October 27, 2024

const formatterGerman = new Intl.DateTimeFormat('de-DE', { year: 'numeric', month: 'long', day: 'numeric' });
console.log(formatterGerman.format(plainDate)); // פלט: 27. Oktober 2024

ניתן להתאים אישית את אפשרויות העיצוב לצרכים שלכם. הארגומנט הראשון ל-`Intl.DateTimeFormat` הוא המיקום (locale), שקובע את השפה והמוסכמות האזוריות המשמשות לעיצוב. שימוש במיקומים שונים (למשל, 'en-US', 'de-DE', 'fr-FR', 'ja-JP') מפיק פורמטים שונים של פלט.

עיצוב `Temporal.ZonedDateTime`

עיצוב `Temporal.ZonedDateTime` דומה, אך ניתן גם לכלול מידע על אזור הזמן בפלט:

const plainDateTime = new Temporal.PlainDateTime(2024, 10, 27, 10, 30, 0);
const timeZone = 'America/Los_Angeles';
const zonedDateTime = plainDateTime.toZonedDateTime(timeZone);

const formatter = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric', timeZoneName: 'short' });
console.log(formatter.format(zonedDateTime)); // פלט: October 27, 2024, 10:30 AM PDT (קיצור אזור הזמן תלוי בחוקי שעון קיץ)

שיטות עבודה מומלצות לבינאום

כאשר עובדים עם תאריכים וזמנים בהקשר גלובלי, יש לזכור את השיטות המומלצות הבאות:

השוואה בין Temporal API לאובייקט ה-Date הוותיק

להלן טבלה המדגישה את ההבדלים והיתרונות המרכזיים של ה-Temporal API בהשוואה לאובייקט ה-`Date` הוותיק:

תכונה אובייקט `Date` הוותיק Temporal API
יכולת שינוי (Mutability) ניתן לשינוי (משנה את האובייקט המקורי) בלתי ניתן לשינוי (מחזיר אובייקטים חדשים)
תמיכה באזורי זמן מוגבלת ולעיתים קרובות בעייתית חזקה ומדויקת, מבוססת על מסד הנתונים של IANA
API לא עקבי וקשה לשימוש ברור, עקבי ואינטואיטיבי
דיוק מילי-שנייה ננו-שנייה
מערכות לוח שנה מוגבל לגרגוריאני תומך במערכות לוח שנה חלופיות (עם תמיכה מתפתחת)
בינאום דורש ספריות חיצוניות לבינאום חזק תמיכה מובנית ואינטגרציה חלקה עם `Intl.DateTimeFormat`

תמיכת דפדפנים ופוליפילים (Polyfills)

כ-API חדש יחסית, תמיכת הדפדפנים ב-Temporal API עדיין מתפתחת. בדקו את טבלאות תאימות הדפדפנים העדכניות (למשל, ב-MDN Web Docs) כדי לראות אילו דפדפנים וסביבות תומכים בו באופן מובנה. עבור דפדפנים ישנים יותר או סביבות ללא תמיכה מובנית, ניתן להשתמש בפוליפילים כדי לספק את פונקציונליות ה-Temporal API. חפשו "Temporal API polyfill" באינטרנט כדי למצוא אפשרויות מתאימות.

סיכום

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

למידה נוספת

JavaScript Temporal API: טיפול מודרני בתאריכים וזמנים לקהל גלובלי | MLOG