繁体   English   中英

Java setTimeZone 更改日期

[英]Java setTimeZone changing date

我正在将字符串“2020 年 11 月 15 日”解析为日期。 我需要将时区设置为 EDT,但这会将日期更改为 2020 年 11 月 14 日。 我假设因为我在 CST 中,所以它正在消除那个小时的时差:Sun Nov 15 00:00:00 CST 2020,这变成了前一天。

我想在不修改日期的情况下设置时区。 我怎么能 go 关于这样做? 仅仅增加一个小时是不够的。

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

Java 中的时间(根据日期 object 和 System.currentTimeMillis)定义为 1970 年 1 月 1 日 00:00:00 GMT 之后的毫秒数。 TimeZone 所做的所有设置都是在特定(Java)时间以小时为单位本地化偏移量。

所以你有三个选择:

  1. 不要添加额外的小时并将时区设置为 EST,在这种情况下您会得到一个新日期。
  2. 添加额外的小时,在这种情况下日期将保持不变
  3. 查找或构建您自己的时间/日期 package

日期没有时区

我想在不修改日期的情况下设置时区。

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

避免遗留的日期时间类

您正在使用几年前被 JSR 310 中定义的java.time类取代的糟糕的日期时间类。切勿使用SimpleDateFormatDateCalendar

Java(传统和现代)和标准 SQL 中的日期时间类型表。

LocalDate

在 Java 中,没有时间和时间的仅日期值由LocalDate class 表示。

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

请参阅在 IdeOne.com 上实时运行的代码

ld.toString: 2020-11-15

片刻

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

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

Continent/Region格式指定适当的时区名称,例如America/MontrealAfrica/CasablancaPacific/Auckland 切勿使用ESTEDTCSTIST等 2-4 个字母的缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的 (.),例如, CST可以是中国标准时间,就像美洲中部标准时间。

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

zdt.toString(): 2020-11-15T00:00-05:00[美国/蒙特利尔]

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

Instant instant = zdt.toInstant() ;

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

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

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

兑换

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

旧版 class Date虽然名称错误,但等效于Instant ,两者都代表 UTC 中的时刻。 Instant使用更精细的纳秒分辨率,而不是毫秒。

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

…和…

Instant instant = d.toInstant() ;

请注意Date::toString方法说谎,应用当前默认时区。 虽然是出于好意,但在实践中这很令人困惑。 避免使用此 class 的众多原因之一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM