אפשר להגיד שיש בלאגן בכל מה שקשור לזמנים בשפות תכנות. אני אתאר פה את המצב ב JAVA גרסה 7 (בגרסה 8 יש API אחר) אבל גם בשפות אחרות הנושא הזה מורכב מהרבה פרטים.
Time zone
העולם מחולק לאזורי זמן (לפי קוי אורך). יש כמה אזור שקיבלו שם משלהם. והשאר מצויינים ע"י ההפרש מאותו אזור מפורסם.
לדוגמא - ישראל באזור GMT+2 כלומר שעתיים אחרי הזמן באזור GMT.
בהמשך יתוארו כמה מהאזורים שזכו לקבל שם.
אבל לפני כן, קצת הסטוריה?
קצת הסטוריה
את החלוקה לאזורי זמן התחילו בסוף המאה ה 19. זאת כפתרון לבעיה של לוח הזמנים של רכבות שהיה להן מסלול מאוד ארוך. החלוקה הראשונה היתה של ארצות הברית ואח"כ המשיכו לחלק את שאר העולם.PST
ראשי תיבות של Pacific Standard Time. נקרא לפעמים בקיצור Pacific Time. הוא אזור הזמן של החוף המערבי של ארצות הברית (לוס אנג'לס, סן פרנסיסקו, עמק הסיליקון).
אזור הזמן הזה נמצא 8 שעות לפני אזור GMT, ו 10 שעות לפני הזמן בישראל (אנחנו באזור GMT+2).
GMT
ראשי תיבות של Greenwich Mean Time. הזמן לפי מצפה הכוכבים המלכותי של גריניץ', שברובע גריניץ' בעיר לונדון בירת הממלכה המאוחדת.
הזמן נמדד על ידי מציאת השעה ביום בה השמש נמצאת בנקודה הגבוהה ביותר במסלולה כפי שזו נראית ממצפה הכוכבים. זוהי השעה 12:00 בצהרים לפי שעון גריניץ'.
UTC
ראשי תיבות של Coordinated Universal Time (בשינוי סדר המילים). זה השם החדש של זמן גריניץ. כך לא מציינים שם מקום בשם אזור הזמן.
כמה פרטים מעניינים על שיטה זו:
- ראשי התיבות UTC נוצרו כפשרה בין ראשי התיבות באנגלית (CUT) וראשי התיבות בצרפתית (TUC).
- בהקשרים תעופתיים וימיים, נקרא זמן UTC "זמן זולו" - Zulu time, והשעה מצוינת בתוספת Z: למשל השעה 23:20 UTC ב"זמן זולו" תיכתב כ-2320Z.
EST
אזור זמן החוף המזרחי של ארצות הברית (ניו יורק).
מאתר ויקיפדיה:
Java Calendar and Timezone
בג'אווה יש שתי מחלקות לניהול הזמן - Calendar ו TimeZone. גם מוזכרים המחלקה GregorianCalendar והמחלקה Locale והשמחה רבה...
חשוב לדעת שלמחלקה Date אין שום מושג של TimeZone !
איך מייצרים Calendar object
שיטה אחת היא ע"י Calendar.getInstance אבל היא לא מומלצת כי היא מחזיקה אובייקט שמתאים לזמן המקומי:
Calendar d1 = Calendar.getInstance();
Calendar d2 = Calendar.getInstance(TimeZone.getTimeZone("Asia/Jerusalem"));
עדיף להשתמש בשיטה מפורשת:
Calendar d = new GregorianCalendar();
התנהגות מוזרה - קבלת זמן אחר ממה שהוכנס לאובייקט
כאשר מריצים את התוכנית הבאה:
public static void main(String[] args) {
TimeZone israel = TimeZone.getTimeZone("Asia/Jerusalem");
Calendar localSystemCalender = Calendar.getInstance();
System.out.println("Local system timezone is " +
localSystemCalender.getTimeZone().getDisplayName());
// enter local date
Calendar c = Calendar.getInstance(israel);
c.set(2019, 11, 24, 9, 54, 00);
// print this date
System.out.println("Calendar timezone is " + c.getTimeZone().getDisplayName());
System.out.println("Current time is " + c.getTime());
}
בצורה הבאה (בדר"כ מריצים את השרת בתוכנה רצינית עם TimeZone אחיד - PST בדר"כ):
java -Duser.timezone=PST main
אז מתקבל הפלט הבא:
Local system timezone is Pacific Standard Time
Calendar timezone is Israel Standard Time
Current time is Mon Dec 23 23:54:00 PST 2019
אבל מה שציפינו היה שהזמן שיוצג יהיה הזמן שהכנסנו - 9:54:0 ולא הזמן ב PST שהוא 10 שעות אחורה - 23:54:00. הרי אמרנו לתוכנית שלוח השנה הוא באזור זמן ישראל!
אבל לא - מה שלוח השנה החזיר הוא אובייקט Date עם זמן באזור PST כי זה אזור הזמן שבו התוכנית רצה (בגלל שהוספנו פרמטר user.timezone לפקודת הריצה).
אז בשביל מה יש בכלל את המחלקה Calendar? בעיקר בשביל לחבר ולחסר תאריכים.
אבל לא - מה שלוח השנה החזיר הוא אובייקט Date עם זמן באזור PST כי זה אזור הזמן שבו התוכנית רצה (בגלל שהוספנו פרמטר user.timezone לפקודת הריצה).
אז בשביל מה יש בכלל את המחלקה Calendar? בעיקר בשביל לחבר ולחסר תאריכים.
טוב, אז חשבנו ... עכשיו אנחנו יודעים שזה המצב.
אז איך מקבלים את הזמן בישראל?
משתמשים ב DateFormat ו SimpleDateFormat. הם מבינים TimeZone ויודעים לעשות את ההמרה:
והנה הפלט של הרצה עם אותה פקודה:
וזו רק ההתחלה ...
public static void main(String[] args) {
TimeZone israel = TimeZone.getTimeZone("Asia/Jerusalem");
Calendar localSystemCalender = Calendar.getInstance();
System.out.println("Local system timezone is " +
localSystemCalender.getTimeZone().getDisplayName());
Calendar c = Calendar.getInstance(israel);
c.set(2019, 11, 24, 9, 54, 00);
System.out.println("Calendar timezone is " + c.getTimeZone().getDisplayName());
System.out.println("Current time is " + c.getTime());
DateFormat df = new SimpleDateFormat();
df.setTimeZone(israel);
String s = df.format(c.getTime());
System.out.println("Time is israel is " + s);
}
Local system timezone is Pacific Standard Time
Calendar timezone is Israel Standard Time
Current time is Mon Dec 23 23:54:00 PST 2019
Time is israel is 09:54 24/12/19
וזו רק ההתחלה ...
Comments