如何在 Joda-Time 时间戳中保留时区?

问题描述 投票:0回答:2

我正在解析时间戳。当我读入它们时,它们被强制为我的本地时区(欧洲/伦敦)。我想保留原始时区偏移量。

scala> val fmt = org.joda.time.format.ISODateTimeFormat.dateTimeNoMillis()

scala> val t = fmt parseDateTime ("2012-04-16T23:00:45-04:00")
t: org.joda.time.DateTime = 2012-04-17T04:00:45.000+01:00

scala> t.getDayOfMonth
res2: Int = 17

scala> fmt print t
res1: java.lang.String = 2012-04-17T04:00:45+01:00

在此示例中,从美国/纽约的时间戳被强制发送到欧洲/伦敦。当我将日期时间转换回字符串时,我想取回我输入的原始字符串。

此外,当我询问时间戳是来自该月的哪一天时,我希望它说是从 16 日开始(因为这是生成日期的日期),而不是 17 日(即使那是日期)在同一时刻在我的时区)。

我该怎么做?

java scala timezone jodatime
2个回答
18
投票

尝试创建一个启用偏移解析的

DateTimeFormatter
这应该会导致解析后的
DateTime
对象保留与最初解析的字符串的偏移量。

如果这不起作用,您可能需要单独存储时区。然后,要打印日期,您需要检索日期本身、目标时区。 设置所需时区的格式化程序,并使用它来格式化日期。


0
投票

java.time

以下为Joda-Time主页上的通知:

请注意,从 Java SE 8 开始,用户被要求迁移到

java.time
(JSR-310) - JDK 的核心部分,它取代了这个 项目。

使用现代日期时间 API 的解决方案

您不需要使用

java.time
API 启用偏移解析。使用
OffsetDateTime#parse
解析它后,您可以根据您的要求将其转换为另一个具有不同时区偏移的
OffsetDateTime

演示:

public class Main {
    public static void main(String[] args) {
        OffsetDateTime odt = OffsetDateTime.parse("2012-04-16T23:00:45-04:00");
        System.out.println(odt);

        // If you want to convert it into another `OffsetDateTime` with a different
        // time zone offset e.g. at ZoneOffset.of("+01:00")
        System.out.println(odt.withOffsetSameInstant(ZoneOffset.of("+01:00")));
    }
}

输出:

2012-04-16T23:00:45-04:00
2012-04-17T04:00:45+01:00

在线演示

Trail:日期时间了解有关现代日期时间 API 的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.