[英]Get java.util.Calendar from days since epoch
在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
这表明仅使用例如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
仍然“关闭”的原因是toString()
方法使用默认的TimeZone
来构建字符串。 在顶部我们将其设置为GMT-1,所以一切正常。
Calendar cal = new GregorianCalendar();
cal.setTimeInMillis(0);
cal.add(Calendar.DAY_OF_MONTH, daysSinceEpoch);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.