gpt4 book ai didi

java - 从 CST 到 GMT 的日期格式转换不起作用

转载 作者:行者123 更新时间:2023-11-29 06:52:27 67 4
gpt4 key购买 nike

我有一个 CST(24 小时)日期字符串,我想将其转换为 GMT(12 小时)。我有一个如下所示的 java 方法,当我的系统时间是加尔各答时间时,它可以正常工作。 (我运行java方法的系统)但是当我的系统在上海时间时,GMT 时间不正确。

String inputDate = "01-19-2017 06:01 CST";
SimpleDateFormat inputFormatter = new SimpleDateFormat("MM-dd-yyyy hh:mm Z");
parsedInput = inputFormatter.parse(inputDate);

// parsedInput -> Tue Jan 19 06:01:00 CST 2017 -> When system time is Shanghai time
// parsedInput -> Thu Jan 19 17:31:00 IST 2017 -> When system time is Kolkata time


SimpleDateFormat formatter = new SimpleDateFormat("MM-dd-yyyy hh:mm a Z");
TimeZone gmt = TimeZone.getTimeZone("GMT");
formatter.setTimeZone(gmt);
String formattedDate = formatter.format(parsedInput);

// formattedDate -> 01-18-2017 10:01 PM +0000 -> When system time is Shanghai time (Incorrect)
// formattedDate -> 01-19-2017 12:01 PM +0000 -> When system time is Kolkata time

最佳答案

避免伪时区

CST 等 3-4 个字母的时区缩写不是实际时区。它们不是标准化的。它们甚至都不是独一无二的!

您的 CST 可能是“中国标准时间”,也可能是美洲的“中部标准时间”,或者可能是其他时间。 无法知道是哪一个。

另一个例子:IST 可能表示“印度标准时间”或“爱尔兰标准时间”或其他。

可靠地破译这些伪区是不可能的。 Joda-Time 库有一个明智的策略,就是拒绝尝试。不幸的是,java.time 类在解析时会进行猜测,但结果可能不是您期望的区域。

所以永远不要使用这些无用的伪区。使用 proper time zone name格式为大陆/地区,例如America/ChicagoAsia/KolkataPacific/Auckland

避免遗留日期时间类

您正在使用麻烦的旧日期时间类,这些类现在已成为遗留问题,已被 java.time 类取代。

解决方法

如果您知道您的所有输入都针对同一时区,则去掉伪时区并作为 LocalDateTime 处理, 将预期区域应用为 ZoneId产生一个ZonedDateDate .从中你可以提取一个 Instant为 UTC 时间。

String input = "01-19-2017 06:01".replace( " " , "T" ) ;  // Insert a “T” to comply with standard ISO 8601 format used by default in java.time.
LocalDateTime ldt = LocalDateTime.parse( input ); // Lacks any concept of time zone or offset-from-UTC. So *not* an actual moment on the timeline.
ZoneId z = ZoneId.of( "America/Chicago" ); // Assuming “CST” meant this zone in North America.
ZonedDateTime zdt = ldt.atZone( z ); // Assign a time zone to determine an actual moment on the timeline.
Instant instant = zdt.toInstant(); // Extract a value in UTC.

您可以选择通过印度挂钟时间的镜头来观看同一时刻。

ZonedDateTime zdtKolkata = zdt.withZoneSameInstant( ZoneId.of( "Asia/Kolkata" ) ) ;

永远不要依赖默认区域

在该 JVM 中执行的任何应用程序的任何线程中的任何代码都可以随时更改 JVM 当前的默认时区。由于这随时可能发生变化,因此您不能依赖某个特定值。

当您省略时区的可选参数时,日期时间类会隐式地应用当前默认时区。所以解决方案很简单:始终指定预期/期望的时区

请注意上面的代码示例如何在每次机会时指定区域。

(顺便说一下,Locale 也是如此。明确指定而不是依赖当前默认值。)

关于java - 从 CST 到 GMT 的日期格式转换不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43523370/

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