[英]Get java.util.Calendar from days since epoch
在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.