2014-09-04 27 views
0

我正在使用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日 请帮忙。

回答

2

LocalDate.ofEpochDay()预计天计数作为它的参数,和你传递秒计数(这是你得到的将毫秒数由1000时)。

0

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