Java使用Java 8时间库

时间:2016-07-18 23:01:40

标签: java spring time java-8

我想使用内置的Java 8时间库将UTC转换为PST / PDT。

我正在编写一个与API对话的程序,该API根据时间范围返回对象列表。例如。从特定日期时间创建/修改的对象。

我的程序使用LocalDateTime,值始终为UTC API接受PST / PDT “所有API响应中表示的时区是PST / PDT。类似地, CompanyName 要求您进行所有时区转换并在PST / PDT中提交任何dateTime请求。” - 引用API文档

我认为它们对PST / PDT的意思是时间值应该反映它是否在白天节省光。
例如。时间值每年变化两次。

如果是这种情况,那么是否有实用/传统的方式将UTC转换为PST / PDT,而无需通过查看确切日期手动确定是否在白天节省时间?

更新

API以JSON格式返回对象 我的应用通过查询参数api.com/objects?modified-date=${yyyy-MM-dd hh:mm:ss}

向其API发送请求

我目前正在使用以下方法进行转换:

public static String toSsTimeStr(LocalDateTime utcTime){
    String pattern  = "yyyy-MM-dd HH:mm:ss";

    ZonedDateTime zdt = ZonedDateTime.ofInstant(utcTime, ZoneOffset.UTC, ZoneId.of("America/Los_Angeles"));

    String timeStr = zdt.format(DateTimeFormatter.ofPattern(pattern));
    return timeStr;
}  

这有助于调整日光节省时间,换句话说,根据当前的白天节省时间状态返回正确的值吗?

谢谢。

2 个答案:

答案 0 :(得分:7)

  

我的程序使用LocalDateTime,值始终为UTC。

LocalDateTime根本没有时区,因此UTC中的不是

在UTC中,请使用Instant类。这表示时间线上的时刻,分辨率高达纳秒。

Instant now = Instant.now();

要调整为时区,请应用ZoneId获取ZonedDateTime

切勿使用像PST& PDT在主流媒体中如此常见。它们不是实时区域,不是标准化的,甚至不是唯一的(!)。以continent/region格式使用proper time zone names

ZoneId zoneId = ZoneId.of( "America/Los_Angeles" );
ZonedDateTime zdt = instant.atZone( zoneId );

听起来你的数据接收器的设计很糟糕,输入的字符串表示日期时间值假设America/Los_Angeles时区但没有任何指标(没有偏离UTC,没有时区)。

要获取此类字符串,缺少任何偏移量或区域,请使用名为DateTimeFormatter的预定义ISO_LOCAL_DATE_TIME。您将获得标准ISO 8601格式的字符串,如下所示:2011-12-03T10:15:30

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME );

您的数据接收器忽略了中间的T,因此请替换为SPACE。

output = output.replace( `T` , " " );

如果数据接收器只需要整秒,则可以截断日期时间值的任何小数秒。

zdt = zdt.truncatedTo( ChronoUnit.SECONDS );

从另一个方向,从字符串到对象,定义格式化程序,解析为LocalDateTime并应用假定的时区。

String input = "2011-12-03 10:15:30";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss" );
LocalDateTime ldt = LocalDateTime.parse( input , formatter );
ZoneId zoneId = ZoneId.of( "America/Los_Angeles" );
ZonedDateTime zdt = ldt.atZone( zoneId );

答案 1 :(得分:1)

怎么样?

ZoneId zid = ZoneId.of(ZoneId.SHORT_IDS.get("PST"));
return LocalDate.now(zid)

SHORT_IDS是基于已识别的TZ缩写获取zoneId的记录方法。 Documentation, FYR