DDoS Community

EladHeller
EladHeller

Posted on

פרסור של חודשים בשפות שונות ב-js

נתקלתי בבעייה הבאה.
אני מקבל טקסט של תאריך. הטקסט תמיד בפורמט אחיד:

12 December 2022
Enter fullscreen mode Exit fullscreen mode

אבל השם של החודש יכול להיות בכל שפה שהיא. אני יודע את השם של השפה, אבל js לא יודעת ליצור תאריך מטקסט מכל שפה, אלא רק מאנגלית. לדוגמה:

new Date('12 December 2022'); // Mon Dec 12 2022 00:00:00
new Date('12 décembre 2022'); // Invalid Date
Enter fullscreen mode Exit fullscreen mode

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

מסתבר שיש כבר את שמות החודשים מתורגמים ב-js, אבל בכיוון הההפוך. המרה של אובייקט תאריך לכל שפה.

const date = new Date(2022, 11, 12);
new Intl.DateTimeFormat('fr', {month: 'long', day: '2-digit', year: 'numeric'}).format(date); // 12 décembre 2022
new Intl.DateTimeFormat('sw', {month: 'long', day: '2-digit', year: 'numeric'}).format(date); // 12 Desemba 2022
Enter fullscreen mode Exit fullscreen mode

עכשיו אני יכול בקלות ליצור קוד שימיר את הטקסט לתאריך:

function convertStringToDate(date: string, language: string): Date {
  const monthNameToNumber = {};
  for (let i = 0; i < 12; i++) {
    const monthName = Intl.DateTimeFormat(language, {month: 'long'}).format(new Date(2022, i));
    monthNameToNumber[monthName] = i;
  }
  const [day, monthName, year] = date.split(' ');
  return new Date(year, monthNameToNumber[monthName], day);
}

convertStringToDate('12 décembre 2022', 'fr'); // Mon Dec 12 2022 00:00:00
Enter fullscreen mode Exit fullscreen mode

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

convertStringToDate('12 בדצמבר 2022', 'he'); // Invalid Date
Enter fullscreen mode Exit fullscreen mode

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

function convertStringToDate(date: string, language: string): Date {
  const monthNameToNumber = {};
  for (let i = 0; i < 12; i++) {
    const monthName = Intl.DateTimeFormat(language, {day: 'numeric', month: 'long'})
      .format(new Date(2022, i))
      .split(' ')[1];
    monthNameToNumber[monthName] = i;
  }
  const [day, monthName, year] = date.split(' ');
  return new Date(year, monthNameToNumber[monthName], day);
}

convertStringToDate('12 בדצמבר 2022', 'he'); // Mon Dec 12 2022 00:00:00
Enter fullscreen mode Exit fullscreen mode

עכשיו הקוד שלנו מוכן!

ובכן, לא. הוא לא יעבוד בפורטוגזית וספרדית (1 de janeiro), הוא גם לא יעבוד ביפנית, קוריאנית וסינית.
תאריכים זה דבר מסובך, שפות זה דבר מסובך.
עדיף מאוד להשתמש בספרייה אם אתם לא ממש בטוחים מה אתם עושים :(

Discussion (0)