如何将javax.time.Instant格式化为本地时区中的字符串?

如何将javax.time.Instant为本地时区中的字符串? 以下内容将本地Instant转换为UTC ,而不是按照我的预期转换为本地时区。 删除对toLocalDateTime()的调用toLocalDateTime()如此。 我怎样才能获得当地时间?

 public String getDateTimeString( final Instant instant ) { checkNotNull( instant ); DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); DateTimeFormatter formatter = builder.appendPattern( "yyyyMMddHHmmss" ).toFormatter(); return formatter.print( ZonedDateTime.ofInstant( instant, TimeZone.UTC ).toLocalDateTime() ); } 

注意:我们使用的是JSR-310参考实现的旧版本0.6.3 。

回答这个问题,几乎完成了JDK1.8版本

 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.systemDefault()); return formatter.format(instant); 

关键是Instant没有任何时区信息。 因此,不能使用基于日期/时间字段的任何模式来格式化它,例如“yyyyMMddHHmmss”。 通过在DateTimeFormatter指定区域,在格式化期间将瞬间转换为指定的时区,从而允许正确输出。

另一种方法是转换为ZonedDateTime

 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); return formatter.format(ZonedDateTime.ofInstant(instant, ZoneId.systemDefault())); 

两种方法都是等价的,但是如果我的数据对象是Instant ,我通常会选择第一种方法。

你为什么期望它使用当地时区? 您明确要求UTC:

 ZonedDateTime.ofInstant(instant, TimeZone.UTC) 

只需指定您当地的时区:

 ZonedDateTime.ofInstant(instant, TimeZone.getDefault()) 

尝试这个:

 String dateTime = DateTimeFormatter.ISO_ZONED_DATE_TIME.format( ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()) ); 

这给出了:

 2014-08-25T21:52:07-07:00[America/Los_Angeles] 

您可以使用DateTimeFormatter.ISO_ZONED_DATE_TIME其他内容作为格式化程序来更改格式。 DateTimeFormatter有一堆预定义的格式化程序,或者您可以定义自己的格式化程序。

在您投票给我的答案之前,请注意明确(并以粗体字体表示)的问题是指JSR-310参考实现的旧版本0.6.3 我在2012年12月问了这个问题,早在Java 8到来之前和新的日期库!


我放弃了JSR-310类DateTimeFormatterZonedDateTime ,而是采用了老式的java.util.Datejava.text.SimpleDateFormat

 public String getDateTimeString( final Instant instant ) { checkNotNull( instant ); DateFormat format = new SimpleDateFormat( "yyyyMMddHHmmss" ); Date date = new Date( instant.toEpochMillisLong() ); return format.format( date ); }