从时代开始的几天里获取java.util.Calendar

Thy*_*hys 5 java calendar date

我有含有天自变量历元基准日期1970-01-01用于某一日期。

有人知道将该变量转换为a的方法java.util.Calendar吗?

小智 5

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

LocalDate date = LocalDate.ofEpochDay(1000);
Run Code Online (Sandbox Code Playgroud)

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

  • 仅供参考:在 [*ThreeTen-Backport*](http://www.threeten.org/threetenbp/) 中,大部分 java.time 功能已向后移植到 Java 6 和 7。在 [*ThreeTenABP*](https://github.com/JakeWharton/ThreeTenABP) 项目中进一步适用于 Android。 (3认同)

mus*_*iKk 3

以下应该有效:

Calendar c = new GregorianCalendar();
c.setTime(new Date(0));

c.add(Calendar.DAY_OF_YEAR, 1000);

System.err.println(c.getTime());
Run Code Online (Sandbox Code Playgroud)

关于时区的注释:

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));
Run Code Online (Sandbox Code Playgroud)

这打印

Wed Dec 31 23:00:00 GMT-01:00 1969
365
Thu Jan 01 23:00:00 GMT-01:00 1970
1
Run Code Online (Sandbox Code Playgroud)

这表明仅使用 eg 是不够的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
Run Code Online (Sandbox Code Playgroud)

现在日历返回有用的值。Date返回的仍然是“off”的原因c.getTime()是该toString()方法使用默认值TimeZone来构建字符串。在顶部,我们将其设置为 GMT-1,因此一切正常。