gpt4 book ai didi

Java 使用 Java 8 时间库将 UTC 转换为 PDT/PST

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:16 26 4
gpt4 key购买 nike

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

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

我的程序使用 LocalDateTime并且该值始终采用 UTC。
API 接受 PST/PDT。
“所有 API 响应中表示的时区是 PST/PDT。同样,CompanyName 要求您进行所有时区转换并提交 PST/PDT 中的任何日期时间请求。” -- 引用自 API 文档

我觉得他们说的PST/PDT的意思是时间值应该反射(reflect)是不是夏令时。
例如。时间值每年变化两次。

如果是这样,是否有一种实用/传统的方法可以将 UTC 转换为 PST/PDT,而无需通过查看确切日期手动确定它是否处于夏令时?

更新

API以JSON格式返回对象。
我的应用程序使用查询参数向其 API 发送请求 api.com/objects?modified-date=${yyyy-MM-dd hh:mm:ss}

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

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;
}

这是否有助于调整夏令时,换句话说,根据我当前的夏令时状态返回正确的值?

谢谢。

最佳答案

My program uses LocalDateTime and the value is always in UTC.

LocalDateTime 根本没有时区,所以它不是 UTC。

暂时使用 UTC,使用 Instant类(class)。这代表了时间轴上高达纳秒分辨率的时刻。

Instant now = Instant.now();

要调整到时区,请应用 ZoneId 以获得 ZonedDateTime

切勿使用主流媒体中常见的 3-4 个字母缩写,如 PSTPDT。它们不是实时时区,不是标准化的,甚至不是唯一的(!)。使用 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 );

关于Java 使用 Java 8 时间库将 UTC 转换为 PDT/PST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38447216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com