您的代码从 Java 8 更新 51 开始有效
您的代码现在可以运行,从 Mac OS X Mountain Lion 上的 Java 8 Update 51 开始。 Holger 的 Answer 表示早期版本的 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 ) ;
...这样做,我们添加第二个参数,参数是method reference in Java 8 syntax,以调用转换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]