来自java time API的错误日期
问题描述:
我正在使用java 8时间API将时间以毫秒为单位转换为日期,并且从该日期开始出现错误的星期几。 这里是我的代码 -来自java time API的错误日期
long millis = 1406865600000L;
LocalDate localDate = LocalDate.ofEpochDay(millis/1000);
DayOfWeek dow = localDate.getDayOfWeek();
System.out.println(dow);
它打印在周四,而这是迄今为止周五8月1日 请帮忙。
答
Answer by NPE是正确的。
解决方案的代码示例
这里是代码正确处理这种情况。
如果您的输入数字是1970年开始的时间以UTC为单位的毫秒数,则创建一个Instant
。
Instant instant = Instant.ofEpochMilli(1406865600000L);
确定日期需要时区。对于任何特定的时刻,日期因地区而异。例如,巴黎午夜过后的几分钟,法国是一个新的一天,而在魁北克蒙特利尔仍然是“昨天”。
因此,通过应用所需的/预期的时区,将Instant
调整为ZonedDateTime
对象。
ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime zdt = instant.atZone(z);
询问一周中的哪一天。 Java代表enum DayOfWeek
中的每周七天中的每一天。
DayOfWeek dow = zdt.getDayOfWeek();
问DayOfWeek
对象的星期几的名称翻译成在Locale
定义的人类语言。
String output = dow.getDisplayName(TextStyle.FULL_STANDALONE , Locale.CANADA_FRENCH);
转储到控制台。结果,至少对America/Montreal
而言,与您预期的一样,即8月1日星期五。
System.out.println ("input: " + input + " | instant: " + instant + " | zdt: " + zdt + " | dow: " + dow + " | output: " + output);
输入:1406865600000 |即时:2014-08-01T04:00:00Z | zdt:2014-08-01T00:00-04:00 [America/Montreal] | dow:星期五|输出:vendredi