gpt4 book ai didi

java - 将 CST 时区转换为所需的 Java 时区

转载 作者:行者123 更新时间:2023-12-02 01:49:43 25 4
gpt4 key购买 nike

我需要将 CST 日期转换为所需时区。我将得到日期作为字符串,如“11/5/2018 12:54:20”,它位于 CST 时区。我必须将其转换为作为参数传递的时区。假设我们将其视为“GMT+0530”。上述日期的结果最好是“Nov 06 2018 00:24:20”

我尝试了下面的代码,它返回了相同的日期(11/05/2018 12:54:20) 而不是(Nov 06 2018 00:24:20) 。我已在具有 IST 时区的系统上执行此操作。

    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT-0600"));
SimpleDateFormat sdf2 = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+0530"));
System.out.println(sdf2.format(sdf.parse("11/5/2018 12:54:20").getTime()));

编辑:答案:

    DateTimeFormatter f = DateTimeFormatter.ofPattern( "M/d/uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( "11/5/2018 12:54:20" , f ) ;
ZoneId z = ZoneId.of( "GMT-0600" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
System.out.println(zdt);
ZoneId zKolkata = ZoneId.of( "GMT+0530" ) ;
ZonedDateTime zdtKolkata = zdt.withZoneSameInstant( zKolkata ) ;
System.out.println(zdtKolkata);

最佳答案

tl;博士

LocalDateTime                                            // Represent a date and a time-of-day, without offset nor zone. So *not* a moment, *not* a point on the timeline.
.parse(
"11/5/2018 12:54:20" ,
DateTimeFormatter.ofPattern( "d/M/uuuu HH:mm:ss" ) // Define a formatting pattern to match your input string.
) // Returns a `LocalDateTime`.
.atZone( // Assign a time zone, to give meaning to the `LocalDateTime` object, making it a `ZonedDateTime` object.
ZoneId.of( "America/New_York" ) // Define a time zone properly with `Continent/Region` naming, never 2-4 letter pseudo-zones such as CST or IST.
) // Returns a `ZonedDateTime` object.
.withZoneSameInstant( // Adjust from New York time to Kolkata time. Some moment, different wall-clock time.
ZoneId.of( "Asia/Kolkata" )
) // Returns another `ZonedDateTime` object rather than altering (“mutating”) the original, per Immutable Objects pattern.
.toString() // Generate text in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.

2018-05-11T22:24:20+05:30[Asia/Kolkata]

java.time

您正在使用糟糕的旧类,现在已被 java.time 类取代。

将您的输入字符串解析为 LocalDateTime,因为它缺少与 UTC 或时区的偏移量的任何指示。

定义格式模式以匹配您的输入。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "d/M/uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( "11/5/2018 12:54:20" , f ) ;

ldt.toString(): 2018-05-11T12:54:20

您说这是用于 CST 的。您指的是中国标准时间吗?或者北美中部标准时间?

指定proper time zone name格式为大洲/地区,如America/Montreal , Africa/Casablanca ,或太平洋/奥克兰。切勿使用 2-4 个字母的缩写,例如 CSTESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

我假设你指的是纽约时间。

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;

zdt.toString(): 2018-05-11T12:54:20-04:00[America/New_York]

显然,您希望通过不同地区、不同时区的人们使用的挂钟时间的镜头来看到同一时刻。 IST 您指的是爱尔兰标准时间吗?还是印度标准时间?再次强调,使用实时时区而不是这些 2-4 个字符的伪时区。

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

zdtKolkata.toString(): 2018-05-11T22:24:20+05:30[Asia/Kolkata]

要查看 UTC 中的同一时刻,请提取即时

Instant instant = zdtKolkata.toInstant() ;

instant.toString(): 2018-05-11T16:54:20Z

所有这三个(zdtzdtKolkatainstant)都代表同一时刻,时间轴上的同一点。

相比之下,作为 LocalDateTime 对象的 ldt 确实代表一个时刻,不是一个点在时间轴上。在您为其分配时区并为其提供上下文之前,它没有任何实际意义。在分配该区域之前,我们不知道在澳大利亚、非洲还是美国是否表示中午时间。它可能意味着大约 26-27 小时中的任何一个,即全局时区的范围。

ISO 8601

不要发明自己的格式来将日期时间值作为文本交换,而是使用标准 ISO 8601格式。

java.time 类方便地使用 ISO 8601生成/解析字符串时默认的格式。

<小时/>

关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在位于 maintenance mode ,建议迁移到java.time类。

要了解更多信息,请参阅 Oracle Tutorial 。并在 Stack Overflow 上搜索许多示例和解释。规范为JSR 310 .

您可以直接与数据库交换java.time对象。使用JDBC driver符合JDBC 4.2或稍后。不需要字符串,不需要 java.sql.* 类。

从哪里获取java.time类?

ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 java.time future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter ,和more .

关于java - 将 CST 时区转换为所需的 Java 时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53162599/

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