26

如何javax.time.Instant在本地时区将 a 格式化为字符串?以下将 local 转换InstantUTC,而不是我期望的本地时区。删除对的调用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 。

4

4 回答 4

40

在即将完成的 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.

于 2013-04-09T14:23:55.587 回答
6

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

ZonedDateTime.ofInstant(instant, TimeZone.UTC)

只需指定您的本地时区:

ZonedDateTime.ofInstant(instant, TimeZone.getDefault())
于 2012-12-06T20:39:31.930 回答
1

在您对我的回答投反对票之前,请注意该问题明确(并以粗体字表示)指的是 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 );
}
于 2012-12-06T21:24:46.060 回答
1

试试这个:

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 有一堆预定义的格式化程序,或者你可以定义自己的。

于 2014-08-26T05:27:45.733 回答