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

时间:2012-12-06 20:33:26

标签: java datetime formatting timezone jsr310

如何在本地时区将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

4 个答案:

答案 0 :(得分:36)

用几乎完成的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,我通常会选择第一种方法。

答案 1 :(得分:6)

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

ZonedDateTime.ofInstant(instant, TimeZone.UTC)

只需指定您的本地时区:

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

答案 2 :(得分: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 );
}

答案 3 :(得分: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有一堆预定义的格式化程序,或者您可以定义自己的格式化程序。