从epoch开始的几天获取java.util.Calendar

我有一个变量,包含自1970-01-01 纪元参考日期以来某个日期的日期。

有人知道将此变量转换为java.util.Calendar吗?

以下应该有效:

 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); 

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

 LocalDate date = LocalDate.ofEpochDay(1000); 

调用ofEpochDay(long epochDay)从纪元日计数中获取LocalDate的实例。