Skip to main content

אזורי זמן בג'אווה בגרסה 7


אפשר להגיד שיש בלאגן בכל מה שקשור לזמנים בשפות תכנות. אני אתאר פה את המצב ב 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? בעיקר בשביל לחבר ולחסר תאריכים.

טוב, אז חשבנו ... עכשיו אנחנו יודעים שזה המצב.


אז איך מקבלים את הזמן בישראל?

משתמשים ב 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

Popular posts from this blog

Best freeware - XML editor

As a software developer, I open XML files all the time. I a heavy commercial XML editor. But nothing can compare to a small, thin and free XML editor like 'foxe'. A great feature is has is the alignment of long XML strings to readable XML format (Shift-F8). It help lot of times when the XML file was generated by some tool and was not readable. Homepage: http://www.firstobject.com/dn_editor.htm

SSL in pictures

Here is my summary on SSL (or as I like to call it 'SSL for dummies')

Jenkins error: groovy.lang.MissingPropertyException

I tried to run groovy build step and got below error. This post will describe how I solved the problem. Caught: groovy.lang.MissingPropertyException: No such property: hudson for class: script