簡體   English   中英

從epoch開始的幾天獲取java.util.Calendar

[英]Get java.util.Calendar from days since epoch

我有一個變量,包含自1970-01-01 紀元參考日期以來某個日期的日期。

有人知道將此變量轉換為java.util.Calendar嗎?

在Java 8及更高版本中使用java.time類。 在一行中:

LocalDate date = LocalDate.ofEpochDay(1000);

調用ofEpochDay(long epochDay)從紀元日計數中獲取LocalDate的實例。

以下應該有效:

Calendar c = new GregorianCalendar();
c.setTime(new Date(0));

c.add(Calendar.DAY_OF_YEAR, 1000);

System.err.println(c.getTime());

關於時區的說明:

使用運行程序的系統的默認時區創建新的GregorianCalendar實例。 由於Epoch與UTC(Java中的GMT)相關,因此必須小心處理與UTC不同的任何時區。 以下程序說明了問題:

TimeZone.setDefault(TimeZone.getTimeZone("GMT-1"));

Calendar c = new GregorianCalendar();
c.setTimeInMillis(0);

System.err.println(c.getTime());
System.err.println(c.get(Calendar.DAY_OF_YEAR));

c.add(Calendar.DAY_OF_YEAR, 1);
System.err.println(c.getTime());
System.err.println(c.get(Calendar.DAY_OF_YEAR));

這打印

Wed Dec 31 23:00:00 GMT-01:00 1969
365
Thu Jan 01 23:00:00 GMT-01:00 1970
1

這表明僅使用例如c.get(Calendar.DAY_OF_YEAR)是不夠的。 在這種情況下,必須始終考慮它是什么時間。 在創建GregorianCalendar時,可以通過顯式使用GMT來避免這種情況: new GregorianCalendar(TimeZone.getTimeZone("GMT")) 如果創建了這樣的日歷,則輸出為:

Wed Dec 31 23:00:00 GMT-01:00 1969
1
Thu Jan 01 23:00:00 GMT-01:00 1970
2

現在日歷返回有用的值。 c.getTime()返回的Date仍然“關閉”的原因是toString()方法使用默認的TimeZone來構建字符串。 在頂部我們將其設置為GMT-1,所以一切正常。

Calendar cal = new GregorianCalendar();
cal.setTimeInMillis(0);
cal.add(Calendar.DAY_OF_MONTH, daysSinceEpoch);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM