[英]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)时间以小时为单位本地化偏移量。
所以你有三个选择:
我想在不修改日期的情况下设置时区。
仅日期值(例如 2020 年 11 月 15 日)没有时区概念。 您无需担心时区。
您正在使用几年前被 JSR 310 中定义的java.time类取代的糟糕的日期时间类。切勿使用SimpleDateFormat
、 Date
或Calendar
。
LocalDate
在 Java 中,没有时间和时间的仅日期值由LocalDate
class 表示。
String input = "11/15/2020" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu" ) ;
LocalDate ld = LocalDate.parse( input , f ) ;
ld.toString: 2020-11-15
也许您确实想要片刻而不仅仅是约会。 我想这意味着你想要一天的第一刻。
不要假设一天从 00:00:00 开始。 夏令时 (DST) 等异常意味着一天可能从 01:00:00 等时间开始。 让java.time确定特定时区中特定日期的开始时间。
以Continent/Region
格式指定适当的时区名称,例如America/Montreal
、 Africa/Casablanca
或Pacific/Auckland
。 切勿使用EST
、 EDT
、 CST
或IST
等 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.