【发布时间】:2011-05-23 07:57:24
【问题描述】:
我有一个变量,其中包含自 1970-01-01 的 epoch reference date 到某个日期以来的天数。
有人知道将此变量转换为java.util.Calendar 的方法吗?
【问题讨论】:
我有一个变量,其中包含自 1970-01-01 的 epoch reference date 到某个日期以来的天数。
有人知道将此变量转换为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
这表明仅使用 e.g. 是不够的。 c.get(Calendar.DAY_OF_YEAR)。在这种情况下,必须始终考虑到它是一天中的什么时间。这可以通过在创建GregorianCalendar:new 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
现在日历返回有用的值。 c.getTime() 返回的Date 仍然“关闭”的原因是toString() 方法使用默认的TimeZone 来构建字符串。在顶部,我们将其设置为 GMT-1,因此一切正常。
【讨论】:
Date 的输出是 Thu Jan 01 23:00:00 GMT-01:00 1970。这与另一个 TZ 中的时间完全相同。 Unix 时间总是相对于 UTC(相关维基百科文章中提到的所有警告)。
Calendar cal = new GregorianCalendar();
cal.setTimeInMillis(0);
cal.add(Calendar.DAY_OF_MONTH, daysSinceEpoch);
【讨论】: