如何格式化 javax.time.Instant
作为本地时区的字符串?以下将本地 Instant
转换为 UTC ,而不是我期望的本地时区。删除对 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() );
}
注意:我们使用的是旧版本 0.6.3的JSR-310引用实现。
用即将完成的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
,我通常会选择第一种。
我是一名优秀的程序员,十分优秀!