从 Java 8 Update 51 开始,您的代码有效
从 Mac OS X Mountain Lion 上的 Java 8 Update 51 开始,您的代码现在可以运行。Holger的回答是早期版本的 Java 中可能存在错误。可以理解,因为 java.time 框架在 Java 8 中是全新的。
这是您的代码的修改副本。
String dateStr = "2014-08-16T05:03:45-05:00";
TemporalAccessor creationAccessor = DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse( dateStr );
Instant instant = Instant.from( creationAccessor );
long millisSinceEpoch = instant.toEpochMilli( );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant, ZoneOffset.of( "-05:00" ) );
转储到控制台。
System.out.println( "dateStr: " + dateStr );
System.out.println( "instant: " + instant );
System.out.println( " millis: " + millisSinceEpoch );
System.out.println( " zdt: " + zdt );
跑的时候。
dateStr: 2014-08-16T05:03:45-05:00
instant: 2014-08-16T10:03:45Z
millis: 1408183425000
zdt: 2014-08-16T05:03:45-05:00
规范方法:
parse(CharSequence text, TemporalQuery<T> query)
您可能希望使用替代方法完成解析。
类文档DateTimeFormatter
提到,通常的解析方式应该是调用DateTimeFormatter::parse(CharSequence text, TemporalQuery<T> query)
而不是DateTimeFormatter::parse(CharSequence text)
.
所以代替这个:
String input = "2007-12-03T10:15:30+01:00[Europe/Paris]" ;
TemporalAccessor temporalAccessor = DateTimeFormatter.ISO_DATE_TIME.parse( input ) ;
…这样做,我们添加第二个参数,该参数是Java 8 语法中的方法引用,以调用转换from
方法(在本例中,ZonedDateTime :: from
):
String input = "2007-12-03T10:15:30+01:00[Europe/Paris]" ;
ZonedDateTime zdt = DateTimeFormatter.ISO_DATE_TIME.parse( input , ZonedDateTime :: from ) ;
转储到控制台。
System.out.println("input: " + input );
System.out.println(" zdt: " + zdt );
跑的时候。
input: 2007-12-03T10:15:30+01:00[Europe/Paris]
zdt: 2007-12-03T10:15:30+01:00[Europe/Paris]