gpt4 book ai didi

Java setTimeZone 更改日期

转载 作者:行者123 更新时间:2023-12-01 19:33:53 27 4
gpt4 key购买 nike

我正在将字符串“11/15/2020”解析为日期。我需要将时区设置为 EDT,但这会将日期更改为 11/14/2020。我假设因为我处于 CST,它会消除 2020 年 11 月 15 日星期日 00:00:00 CST 的小时时差,这将成为前一天。

我想设置时区而不修改日期。我该怎么做呢?仅增加一个小时是不够的。

dateFormat dataFormat = new SimpleDateFormat("MM/dd/yy");
dataFormat.setTimeZone(TimeZone.getTimeZone(Constants.EDT_TZN));

最佳答案

日期没有时区

I would like to set the timezone without modifying the date.

纯日期值(例如 2020 年 11 月 15 日)没有时区概念。您无需担心时区。

避免遗留日期时间类

您正在使用可怕的日期时间类,这些类在几年前已被 JSR 310 中定义的 java.time 类取代。切勿使用 SimpleDateFormatDate日历

Table of date-time types in Java (both legacy and modern) and in standard SQL.

本地日期

在 Java 中,不带日期时间的纯日期值由 LocalDate 类表示。

String input = "11/15/2020" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu" ) ;
LocalDate ld = LocalDate.parse( input , f ) ;

查看此code run live at IdeOne.com .

ld.toString: 2020-11-15

时刻

也许您确实想要一点时间,而不仅仅是一次约会。我想这意味着你想要一天的第一时刻。

不要假设一天是从 00:00:00 开始的。夏令时 (DST) 等异常意味着一天可能会在 01:00:00 等时间开始。让java.time确定特定时区的特定日期的开始时间。

指定proper time zone name格式为Continent/Region,例如America/MontrealAfrica/Cas​​ablancaPacific/Auckland 。切勿使用 2-4 个字母的缩写,例如 ESTEDTCSTIST,因为它们< em>不是真正的时区,没有标准化,甚至不是唯一的(!)。例如,CST 可以是中国标准时间,就像美洲中部标准时间一样。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;

zdt.toString(): 2020-11-15T00:00-05:00[America/Montreal]

通常最好以 UTC 格式存储和交换时刻。要将我们指定的时区调整为 UTC,请从 ZonedDateTime 中提取 Instant。根据定义,Instant 始终采用 UTC。

Instant instant = zdt.toInstant() ;

instant.toString(): 2020-11-15T05:00:00Z

按照标准 ISO 8601 生成文本格式。末尾的 Z 表示 UTC,发音为“Zulu”。

instant.toString(): 2020-11-15T05:00:00Z

转换

如果您必须与尚未更新到 java.time 的旧代码进行互操作,您可以来回转换。查看添加到旧类中的新 to.../from... 方法。

遗留类Date虽然命名错误,但等同于Instant,两者都代表UTC中的时刻。 Instant 使用更精细的纳秒分辨率,而不是毫秒。

Date d = java.util.Date.from( instant ) ;

…还有…

Instant instant = d.toInstant() ;

请注意,Date::toString 方法说谎了,它应用了当前的默认时区。虽然本意是好的,但实际上这很令人困惑。避免这门课的众多原因之一。

关于Java setTimeZone 更改日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58525950/

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