如何将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() );
}
注意:我们使用的是 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
以外的其他内容作为格式化程序来更改格式。日期时间格式化程序有一堆预定义的格式化程序,或者您可以定义自己的格式化程序。
问题是关于JSR-310参考实现的0.6.3版本,早在Java 8和新的日期库到来之前。
<小时 />我放弃了DateTimeFormatter
和ZonedDateTime
的JSR-310类,而是求助于老式的java.util.Date
和java.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 );
}