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

2022-09-01 17:02:04

如何将javax.time.Instant格式化为本地时区的字符串?以下内容将本地转换为 UTC,而不是我预期的本地时区。删除对LocalDateTime()的调用也执行相同的操作。如何获取当地时间?Instant

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


答案 1

回答这个问题是即将完成的JDK1.8版本

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

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

另一种方法是转换为 :ZonedDateTime

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

这两种方法都是等效的,但是如果我的数据对象是 .Instant


答案 2

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

ZonedDateTime.ofInstant(instant, TimeZone.UTC)

只需指定您的本地时区:

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