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

时间:2011-05-23 07:57:24

标签: java date calendar

我有一个变量,其中包含特定日期1970-01-01 java.util.Calendar以来的天数。

有人知道将此变量转换为{{1}}的方法吗?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

LocalDate date = LocalDate.ofEpochDay(1000);

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

答案 2 :(得分:2)

以下内容应该有效:

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)。在这种情况下,必须始终考虑它是什么时间。在创建GregorianCalendarnew GregorianCalendar(TimeZone.getTimeZone("GMT"))时,可以明确使用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,所以一切正常。