ממיר חותמת זמן של יוניקס
תאריך ושעה מומרות
ממיר חותמת זמן של יוניקס
מבוא
חותמת זמן של יוניקס (המכונה גם זמן POSIX או זמן אפוק) היא מערכת לתיאור נקודת זמן. היא מספר השניות שחלפו מאז 1 בינואר 1970 (חצות UTC/GMT), מבלי לספור שניות מעוברות. חותמות זמן של יוניקס משמשות באופן נרחב במערכות מחשב ובשפות תכנות מכיוון שהן מספקות ייצוג קומפקטי, בלתי תלוי בשפה של רגע מסוים בזמן.
הממיר הזה מאפשר לך להמיר חותמת זמן של יוניקס לפורמט תאריך ושעה קריא לאדם. הוא תומך בשני פורמטים של זמן: 12 שעות (AM/PM) ו-24 שעות כדי להתאים להעדפות אזוריות ואישיות שונות.
כיצד פועלות חותמות זמן של יוניקס
חותמות זמן של יוניקס מחושבות כמספר השניות מאז אפוק יוניקס (1 בינואר 1970, 00:00:00 UTC). זה הופך אותן לשימושיות במיוחד לחישוב הבדלי זמן ולשמירת תאריכים בפורמט קומפקטי.
ההמרה המתמטית מחותמת זמן של יוניקס לתאריך קלנדרי כוללת מספר שלבים:
- להתחיל עם אפוק יוניקס (1 בינואר 1970, 00:00:00 UTC)
- להוסיף את מספר השניות בחותמת הזמן
- לקחת בחשבון שנים מעוברות, אורכי חודשים משתנים, וסיבוכים קלנדריים אחרים
- להחיל התאמות אזוריות אם יש צורך
למשל, חותמת הזמן של יוניקס 1609459200
מייצגת יום שישי, 1 בינואר 2021, 00:00:00 UTC.
הנוסחה להמרה יכולה להיות מבוטאת כ:
רוב שפות התכנות ומערכות ההפעלה מספקות פונקציות מובנות לטיפול בהמרה זו, ומסתירות את החישובים הקלנדריים המורכבים.
אפשרויות פורמט זמן
הממיר הזה מציע שתי אפשרויות פורמט זמן:
-
פורמט 24 שעות (המכונה לפעמים "זמן צבאי"): השעות נעות בין 0 ל-23, ואין סימון AM/PM. למשל, 15:00 מייצגת את השעה 3:00 PM.
-
פורמט 12 שעות: השעות נעות בין 1 ל-12, עם AM (ante meridiem) לזמנים מחצות עד צהריים, ו-PM (post meridiem) לזמנים מצהריים ועד חצות. למשל, 15:00 בפורמט 24 שעות מייצגת את השעה 3:00 PM.
הבחירה בין הפורמטים הללו היא בעיקר עניין של מסורת אזורית והעדפה אישית:
- פורמט 24 שעות בשימוש נפוץ ברוב אירופה, אמריקה הלטינית ואסיה, כמו גם בהקשרים מדעיים, צבאיים ורפואיים ברחבי העולם.
- פורמט 12 שעות נפוץ בארצות הברית, קנדה, אוסטרליה ובכמה מדינות דוברות אנגלית אחרות לשימוש יומיומי.
מקרים קצה ומגבלות
כאשר עובדים עם חותמות זמן של יוניקס, חשוב להיות מודעים למספר מקרים קצה ומגבלות:
-
חותמות זמן שליליות: מייצגות תאריכים לפני אפוק יוניקס (1 בינואר 1970). בעוד שהן תקפות מתמטית, חלק מהמערכות עשויות לא לטפל בחותמות זמן שליליות בצורה נכונה.
-
בעיית שנת 2038: חותמות זמן של יוניקס נשמרות לעיתים קרובות כמספרים שלמים בני 32 סיביות, שיתמוטטו ב-19 בינואר 2038. לאחר תאריך זה, מערכות של 32 סיביות לא יוכלו לייצג זמנים בצורה נכונה אלא אם ישונו להשתמש בסוג מספר שלם גדול יותר.
-
חותמות זמן גדולות מאוד: תאריכים עתידיים מאוד עשויים שלא להיות ניתנים לייצוג בכמה מערכות, או עשויים להיות מטופלים בצורה לא עקבית.
-
שניות מעוברות: זמן יוניקס אינו לוקח בחשבון שניות מעוברות, המתווספות מדי פעם ל-UTC כדי לפצות על סיבוב לא סדיר של כדור הארץ. משמעות הדבר היא שזמן יוניקס אינו מסונכרן בדיוק עם הזמן האסטרונומי.
-
שיקולים של אזור זמן: חותמות זמן של יוניקס מייצגות רגעים ב-UTC. המרה לזמן מקומי דורשת מידע נוסף על אזור הזמן.
-
שעת חיסכון: כאשר ממירים חותמות זמן לזמן מקומי, יש לקחת בחשבון את המורכבויות של המעברים בשעת חיסכון.
שימושים
חותמות זמן של יוניקס משמשות במספר יישומים ברחבי המחשוב וניהול הנתונים:
-
רשומות מסד נתונים: חותמות זמן משמשות לעיתים קרובות לרישום מתי נוצרו או שונו רשומות.
-
פיתוח אתרים: כותרות HTTP, עוגיות ומנגנוני מטמון משתמשים לעיתים קרובות בחותמות זמן של יוניקס.
-
קבצי יומן: יומני מערכת רושמים בדרך כלל אירועים עם חותמות זמן של יוניקס לצורך סדר כרונולוגי מדויק.
-
מערכות ניהול גרסאות: Git ומערכות ניהול גרסאות אחרות משתמשות בחותמות זמן כדי לרשום מתי נעשו מחויבויות.
-
תגובות API: רבים מה-APIs של האינטרנט כוללים חותמות זמן בתגובותיהם כדי לציין מתי נוצרו נתונים או מתי משאבים שונו לאחרונה.
-
מערכות קבצים: זמני יצירה ושינוי של קבצים נשמרים לעיתים קרובות כחלק מחותמות זמן של יוניקס.
-
ניהול מושבים: יישומי אינטרנט משתמשים בחותמות זמן כדי לקבוע מתי מושבי משתמשים צריכים לפוג.
-
ניתוח נתונים: חותמות זמן מספקות דרך סטנדרטית לעבוד עם נתונים זמניים ביישומי ניתוח.
חלופות
בעוד שחלקות זמן של יוניקס בשימוש נרחב, ישנם פורמטים חלופיים לייצוג זמן שעשויים להיות מתאימים יותר בהקשרים מסוימים:
-
ISO 8601: פורמט מחרוזת סטנדרטי (למשל, "2021-01-01T00:00:00Z") שהוא קריא לאדם תוך שמירה על יכולת מיון. הוא מועדף לעיתים קרובות להחלפת נתונים וליישומים המיועדים למשתמש.
-
RFC 3339: פרופיל של ISO 8601 בשימוש בפרוטוקולי אינטרנט, עם דרישות עיצוב מחמירות יותר.
-
פורמטים קריאים לאדם: מחרוזות תאריך מקומיות (למשל, "1 בינואר 2021") מתאימות יותר לאינטראקציה ישירה עם המשתמש, אך פחות מתאימות לחישוב.
-
Microsoft FILETIME: ערך בן 64 סיביות המייצג את מספר האינטרוולים של 100 ננו-שניות מאז 1 בינואר 1601, בשימוש במערכות Windows.
-
מספר יום יוליאני: בשימוש באסטרונומיה ובחלק מהיישומים המדעיים, סופר ימים מאז 1 בינואר 4713 לפני הספירה.
הבחירה של פורמט הזמן תלויה בגורמים כגון:
- דיוק נדרש
- צרכי קריאות אנושית
- מגבלות אחסון
- תאימות עם מערכות קיימות
- טווח התאריכים שצריך להיות מיוצג
היסטוריה
הרעיון של זמן יוניקס נבע מהפיתוח של מערכת ההפעלה יוניקס במעבדות בל בשנות ה-60 וה-70. ההחלטה להשתמש ב-1 בינואר 1970 כאפוק הייתה במידה מסוימת שרירותית אך מעשית באותה תקופה - היא הייתה קרובה מספיק כדי למזער את דרישות האחסון עבור תאריכים של עניין אך רחוקה מספיק מהעבר כדי להיות שימושית עבור נתונים היסטוריים.
היישום המקורי השתמש במספר שלם בן 32 סיביות כדי לשמור את מספר השניות, מה שהיה מספק עבור אורך החיים הצפוי של מערכות יוניקס באותה תקופה. עם זאת, החלטה זו הובילה לבעיית שנת 2038 (המכונה לעיתים "Y2K38" או "באג המילניום של יוניקס"), מכיוון שמספרים שלמים בני 32 סיביות יכולים לייצג רק תאריכים עד 19 בינואר 2038 (03:14:07 UTC).
כשהיוניקס ומערכות דומות ליוניקס הפכו פופולריות, חותמת הזמן של יוניקס הפכה לסטנדרט דה פקטו לייצוג זמן במחשוב. היא אומצה על ידי שפות תכנות רבות, מסדי נתונים ויישומים, והתרחבה הרבה מעבר לסביבת יוניקס המקורית.
מערכות מודרניות משתמשות יותר ויותר במספרים שלמים בני 64 סיביות עבור חותמות זמן, מה שמאריך את טווח הייצוג לכ-292 מיליארד שנים בכל הכיוונים מהאפוק, ובכך פותר את בעיית שנת 2038. עם זאת, מערכות ויישומים ישנים עשויים עדיין להיות פגיעים.
הפשטות והיכולת של חותמת הזמן של יוניקס הבטיחו את המשך הרלוונטיות שלה למרות הפיתוח של פורמטים יותר מתקדמים לייצוג זמן. היא נשארה מושג בסיסי במחשוב, המהווה בסיס למרבית התשתית הדיגיטלית שלנו.
דוגמאות קוד
הנה דוגמאות כיצד להמיר חותמות זמן של יוניקס לתאריכים קריאים לאדם בשפות תכנות שונות:
// המרת חותמת זמן ב-JavaScript
function convertUnixTimestamp(timestamp, use12Hour = false) {
// צור אובייקט תאריך חדש (JavaScript משתמש במילישניות)
const date = new Date(timestamp * 1000);
// אפשרויות פורמט
const options = {
year: 'numeric',
month: 'long',
day: 'numeric',
weekday: 'long',
hour: use12Hour ? 'numeric' : '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: use12Hour
};
// המרה למחרוזת באמצעות עיצוב מקומי
return date.toLocaleString(undefined, options);
}
// דוגמת שימוש
const timestamp = 1609459200; // 1 בינואר 2021 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // פורמט 24 שעות
console.log(convertUnixTimestamp(timestamp, true)); // פורמט 12 שעות
טיפול במקרים קצה
כאשר עובדים עם חותמות זמן של יוניקס, חשוב לטפל במקרים קצה בצורה נכונה. הנה דוגמאות לטיפול בכמה מקרים קצה נפוצים:
// טיפול במקרים קצה ב-JavaScript
function safeConvertTimestamp(timestamp, use12Hour = false) {
// בדוק אם חותמת הזמן תקפה
if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
return "חותמת זמן לא תקפה";
}
// בדוק חותמות זמן שליליות (תאריכים לפני 1970)
if (timestamp < 0) {
// חלק מהדפדפנים עשויים לא לטפל בחותמות זמן שליליות בצורה נכונה
// השתמש בגישה יותר חסונה עבור תאריכים לפני 1970
const date = new Date(timestamp * 1000);
if (isNaN(date.getTime())) {
return "תאריך לא תקף (לפני 1970)";
}
}
// בדוק בעיית Y2K38 (למערכות 32 סיביות)
const maxInt32 = 2147483647; // הערך המקסימלי עבור מספר שלם בן 32 סיביות
if (timestamp > maxInt32) {
// שקול להשתמש ב-BigInt עבור חותמות זמן גדולות מאוד ב-JavaScript מודרני
console.warn("חותמת הזמן חורגת מהמגבלה של מספר שלם בן 32 סיביות (בעיה Y2K38)");
}
// המשך עם ההמרה הרגילה
try {
const date = new Date(timestamp * 1000);
const options = {
year: 'numeric',
month: 'long',
day: 'numeric',
weekday: 'long',
hour: use12Hour ? 'numeric' : '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: use12Hour
};
return date.toLocaleString(undefined, options);
} catch (error) {
return "שגיאה בהמרת חותמת הזמן: " + error.message;
}
}
הפניות
-
"זמן יוניקס." ויקיפדיה, קרן ויקימדיה, https://he.wikipedia.org/wiki/Unix_time
-
"בעיית שנת 2038." ויקיפדיה, קרן ויקימדיה, https://he.wikipedia.org/wiki/Year_2038_problem
-
אולסון, ארתור דיויד. "המורכבות של זמן קלנדרי." הקבוצה הפתוחה, https://www.usenix.org/legacy/events/usenix01/full_papers/olson/olson.pdf
-
"ISO 8601." ויקיפדיה, קרן ויקימדיה, https://he.wikipedia.org/wiki/ISO_8601
-
"RFC 3339: תאריך ושעה באינטרנט: חותמות זמן." קבוצת מהנדסי האינטרנט (IETF), https://tools.ietf.org/html/rfc3339
-
קרניגן, בריאן וו., ודניס מ. ריצ'י. "שפת התכנות C." פרנטיס הול, 1988.