获取自纪元以来的天数的 java.util.Calendar

发布于 2024-11-09 07:00:56 字数 200 浏览 0 评论 0原文

我有一个变量,其中包含自 1970 年 纪元参考日期以来的天数-01-01 特定日期。

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

I have a variable containing the days since the epoch reference date of 1970-01-01 for a certain date.

Does someone know the way to convert this variable to a java.util.Calendar?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

辞取 2024-11-16 07:00:56

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

LocalDate date = LocalDate.ofEpochDay(1000);

调用 ofEpochDay(long epochDay) 获取 LocalDate 来自纪元天数。

Use the java.time classes in Java 8 and later. In one line:

LocalDate date = LocalDate.ofEpochDay(1000);

Calling ofEpochDay(long epochDay) obtains an instance of LocalDate from the epoch day count.

┈┾☆殇 2024-11-16 07:00:56

以下内容应该有效:

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 仍然是“off”的原因是 toString() 方法使用了默认的 >TimeZone 来构建字符串。在顶部,我们将其设置为 GMT-1,因此一切正常。

The following should work:

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

c.add(Calendar.DAY_OF_YEAR, 1000);

System.err.println(c.getTime());

A note regarding time zones:

A new GregorianCalendar instance is created using the default time zone of the system the program is running on. Since Epoch is relative to UTC (GMT in Java) any time zone different from UTC must be handled with care. The following program illustrates the problem:

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

This prints

Wed Dec 31 23:00:00 GMT-01:00 1969
365
Thu Jan 01 23:00:00 GMT-01:00 1970
1

This demonstrates that it is not enough to use e.g. c.get(Calendar.DAY_OF_YEAR). In this case one must always take into account what time of day it is. This can be avoided by using GMT explicitly when creating the GregorianCalendar: new GregorianCalendar(TimeZone.getTimeZone("GMT")). If the calendar is created such, the output is:

Wed Dec 31 23:00:00 GMT-01:00 1969
1
Thu Jan 01 23:00:00 GMT-01:00 1970
2

Now the calendar returns useful values. The reason why the Date returned by c.getTime() is still "off" is that the toString() method uses the default TimeZone to build the string. At the top we set this to GMT-1 so everything is normal.

雨落□心尘 2024-11-16 07:00:56
Calendar cal = new GregorianCalendar();
cal.setTimeInMillis(0);
cal.add(Calendar.DAY_OF_MONTH, daysSinceEpoch);
Calendar cal = new GregorianCalendar();
cal.setTimeInMillis(0);
cal.add(Calendar.DAY_OF_MONTH, daysSinceEpoch);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文