以下应该工作:
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
这表明仅使用eg是不够的c.get(Calendar.DAY_OF_YEAR)
。在这种情况下,必须始终考虑到一天中的什么时间。这可以通过显式使用GMT创建时要避免GregorianCalendar
: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
现在,日历返回有用的值。为什么原因Date
被退回c.getTime()
仍然是“关”是该toString()
方法使用默认TimeZone
建立的字符串。在顶部,我们将此设置为GMT-1,因此一切正常。