我正在解析时间戳。当我读入它们时,它们被强制为我的本地时区(欧洲/伦敦)。我想保留原始时区偏移量。
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 日(即使那是日期)在同一时刻在我的时区)。
我该怎么做?
尝试创建一个启用偏移解析的
DateTimeFormatter
。这应该会导致解析后的DateTime
对象保留与最初解析的字符串的偏移量。
如果这不起作用,您可能需要单独存储时区。然后,要打印日期,您需要检索日期本身、和目标时区。 设置所需时区的格式化程序,并使用它来格式化日期。
java.time
以下为Joda-Time主页上的通知:
请注意,从 Java SE 8 开始,用户被要求迁移到
(JSR-310) - JDK 的核心部分,它取代了这个 项目。java.time
您不需要使用
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 的更多信息。