Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从纪元后的天获取java.util.Calendar_Java_Date_Calendar - Fatal编程技术网

从纪元后的天获取java.util.Calendar

从纪元后的天获取java.util.Calendar,java,date,calendar,Java,Date,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()); 关于时区的说明: 使用运行程序的系统的默认时区创建一个新的GregoriaCale

我有一个变量,它包含自某个日期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());

关于时区的说明:

使用运行程序的系统的默认时区创建一个新的
GregoriaCalendar
实例。由于历元是相对于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 the年)
是不够的。在这种情况下,人们必须始终考虑一天中的时间。创建
gregoriacalendar
新的gregoriacalendar(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
仍然是“off”的原因是
toString()
方法使用默认的
TimeZone
来构建字符串。在顶部,我们将其设置为GMT-1,以便一切正常。

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

Calendar cal = new GregorianCalendar();
cal.setTimeInMillis(0);
cal.add(Calendar.DAY_OF_MONTH, daysSinceEpoch);
LocalDate date = LocalDate.ofEpochDay(1000);

调用从历元日计数中获取的实例。

哪个历元?与所有其他答案一起,直到现在为止,这将给出一个不正确的日期时区之前(以西)UTC,除非你考虑时区(加一天),当评估结果。@ JARNBJO:我不能确认在测试中。你能提供一个小例子吗?在你的代码前加上“TimeZone.setDefault(TimeZone.getTimeZone(“GMT-1”);”,然后加上一天而不是1000天(以使问题变得明显)。输出将是1970年1月1日,尽管预计是1月2日。@jarnbjo:为什么不预计呢?
日期的输出为
周四1月1日23:00:00 GMT-01:00 1970
。这是完全相同的时刻,只是在另一个时间。Unix时间总是与UTC相对的(在相关的Wikipedia文章中提到了所有的注意事项)。我必须承认这个问题有点含糊不清,但我发现很难接受1970年1月1日之后的一天应该是1970年1月1日。仅供参考:java.time的大部分功能都在2010年重新移植到java 6和java 7。您知道为什么API中为epochDay编写了如此复杂的逻辑吗。看起来很混乱,我不理解你的评论。如果你查看方法api,它写的逻辑有点大。大部分是用于处理的。