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

标签 java date simpledateformat

我需要将 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/

相关文章:

java - 如何将天数添加到java简单日期格式

java - 在aws中导入外部证书

java - Netty:使用 `IdleStateHandler`检测断线

java - 理解这段代码

php - PHP中的日期格式

java - 无法将时间戳格式设置为 YYYY-MM-DD HH :mm:ss in java

android - SimpleDateFormat 只获取时间

java - PayPal 如何在 java sdk(快速结帐)中以编程方式设置凭据

database - 如何将特定日期格式加载到 BigQuery 中

javascript - 使用 Javascript 导出函数返回未定义