我需要将 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 个字母的缩写,例如 CST
或 EST
或 IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
我假设你指的是纽约时间。
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
所有这三个(zdt
、zdtKolkata
、instant
)都代表同一时刻,时间轴上的同一点。
相比之下,作为 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类?
- Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11以及后来的版本 - 具有捆绑实现的标准 Java API 的一部分。
- Java 9 添加了一些小功能和修复。
- Java SE 6和 Java SE 7
- 大多数 java.time 功能已向后移植到 ThreeTen-Backport 中的 Java 6 和 7 .
- Android
- Android 的更高版本捆绑了 java.time 类的实现。
- 对于早期的 Android (<26),ThreeTenABP项目适应ThreeTen-Backport (上文提到的)。请参阅How to use ThreeTenABP… .
ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 java.time future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
,和more .
关于java - 将 CST 时区转换为所需的 Java 时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53162599/