无法使用 Joda Time API 将日期转换为 UTC [关闭]

Posted

技术标签:

【中文标题】无法使用 Joda Time API 将日期转换为 UTC [关闭]【英文标题】:Unable to convert date with UTC using Joda Time API [closed] 【发布时间】:2021-07-19 04:58:37 【问题描述】:

我正在尝试将此日期转换为本地日期

Input: "2021-04-20T15:00:00+02:00";

Expected output: "2021-04-20T13:00:00Z";

Actual output : "2021-04-20T15:00:00

您能告诉我要使用哪个库吗?

代码:

String date = "2021-04-20T15:00:00+02:00";

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");

LocalDateTime dt = LocalDateTime.parse(date, formatter);

System.out.println(dt.toString());

【问题讨论】:

虽然官方的 Joda-Time 建议是切换到 java.time 作为答案,但在亚洲/卡塔尔时区运行时,使用 Joda-Time DateTime.parse(date).withZone(DateTimeZone.getDefault()) 会产生 2021-04-20T16:00:00.000+03:00。那是你当地时间吗?是什么让您期待2021-04-20T13:00:00Z which library:你是指 Joda-Time 库中的哪个库类(DateTimeLocalDateTImeInstant)还是哪个库而不是 Joda-时间(java.time/JSR-310,Time4J)?后一个问题对于 Stack Overflow 来说是题外话。前者是主题。 【参考方案1】:

您可以使用java-8OffsetDateTime解析输入字符串(因为它在ISO-8601中)然后使用toInstant

String timeStamp = "2021-04-20T15:00:00+02:00";
OffsetDateTime.parse(timeStamp).toInstant() //2021-04-20T13:00:00Z

【讨论】:

【参考方案2】:

tl;博士

您使用了错误的类型,LocalDateTime。使用OffsetDateTimeInstant

OffsetDateTime
.parse( "2021-04-20T15:00:00+02:00" )
.toInstant()
.toString()

详情

Joda-Time 库在多年前被 JSR 310 中定义的 java.time 类取代并内置于 Java 8 及更高版本之后,现在处于维护模式。

您的输入显示与 UTC 的偏移量为 +02:00,比 UTC 早两个小时。所以解析为java.time.OffsetDateTime 对象。

OffsetDateTime odt = OffsetDateTime.parse( "2021-04-20T15:00:00+02:00" ) ;

仅提取 Instant 即可调整为 UTC。

Instant instant = odt.toInstant() ;

生成你想要的输出。

String output = instant.toString() ;

【讨论】:

以上是关于无法使用 Joda Time API 将日期转换为 UTC [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Joda Time 将时区日期时间转换为毫秒

如何将日期字符串转换为joda DateTime?

org.joda.time.DateTime 日期格式

Joda DateTime 到 BigDecimal 分数计算

Joda-Time 库指定 mili 秒精度

如何使用 Joda Time 解析包含时区的日期