2008-11-04 71 views
8

程序後跟輸出。有人請向我解釋爲什麼從1970年1月1日開始的10,000,000毫秒是1969年11月31日。那麼請有人解釋我的假設:第一次測試應該從1970年1月1日開始產生10,000,000毫秒的時間,這是錯誤的。相同的結果。Java.util.Calendar - 1970年1月1日以來的毫秒數

public static void main(String[] args) { 

    String x = "10000000"; 
    long l = new Long(x).longValue(); 
    System.out.println("Long value: " + l); 

    Calendar c = new GregorianCalendar(); 
    c.setTimeInMillis(l); 
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis()); 

    String origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH); 
    System.out.println("Date in YYYY-MM-DD format: " + origDate); 

    x = "1000000000000"; 
    l = new Long(x).longValue(); 
    System.out.println("\nLong value: " + l); 

    c.setTimeInMillis(l); 
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis()); 

    origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH); 
    System.out.println("Date in YYYY-MM-DD format: " + origDate); 
} 

Long值:千萬

日曆時間以毫秒:千萬

日期的YYYY-MM-DD格式爲:1969年11月31日

Long值:萬億

Millis日曆時間:1000000000000

在YYYY-MM-DD格式的日期:2001年8月8日

回答

12

的日期c.setTimeInMillis(l);您打印從Calendar是您的本地時區,您可以找出自己,而紀元被定義爲UTC的1970-01-01的午夜。因此,如果您居住在UTC以西的時區,那麼您的日期將顯示爲1969-12-31,即使(在UTC中)仍然是1970-01-01。

+2

謝謝!我以爲我瘋了。 – 2008-11-05 00:39:48

0

如果你改變你的第一個在c.clear();

6

首先,c.get(的Calendar.MONTH)返回0爲一月,1月,等等

其次,使用日期格式,以輸出所選的日期。

第三,你的問題是一個很好的例子,說明Java的Date API有多麼尷尬。如果可以,請使用Joda Time API。它會讓你的生活變得更輕鬆。

這裏是你的代碼,這表明該時區的一個更好的例子:

public static void main(String[] args) { 

    final DateFormat dateFormat = SimpleDateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); 

    long l = 10000000L; 
    System.out.println("Long value: " + l); 
    Calendar c = new GregorianCalendar(); 
    c.setTimeInMillis(l); 
    System.out.println("Date: " + dateFormat.format(c.getTime())); 

    l = 1000000000000L; 
    System.out.println("\nLong value: " + l); 
    c.setTimeInMillis(l); 
    System.out.println("Date: " + dateFormat.format(c.getTime())); 
} 
+0

非常有幫助;你間接地回答了我的問題。時區事情導致我最困惑。該改進代碼是不勝感激。 – 2008-11-05 00:42:44

5

Calendar#setTimeInMillis() 1970年1月1日GMT後設置日曆時間的毫秒數。

Calendar#get()返回爲日曆的時區調整的請求字段,默認爲您機器的本地時區

如您所願如果您在構建日曆指定「GMT」時區這應該工作:

Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT")); 
+0

感謝您的代碼示例。 – 2008-11-05 00:40:37

1

你的時區是最有可能落後于格林尼治標準時間(如GMT-5),因此從10​​,000,000ms時代是1969年12月31日在你的時區,但由於月數是基於零的java.util.Calendar,你的日曆 - >文本轉換是有缺陷的,你會得到1969-11-31,而不是預期的1969-12-31。

3

不幸的是,java.util.Datejava.util.Calendar設計不佳導致這種混淆。

相關問題