您的代码有效,从 Java 8 更新 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::p arse(CharSequence text,TemporalQuery<T> query),
而不是DateTimeFormatter::p arse(CharSequence text)
。DateTimeFormatter
所以不是这个:
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]