如何使用 org.joda.time 设置时区?

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

我想将字符串解析为 DateTime 对象:

DateTimeFormatter fmt = DateTimeFormat.forPattern("M/d/yyyy HH:mm");
DateTime dt = fmt.parseDateTime(stringDate + " " +     stringTime).withZone(DateTimeZone.forID("Europe/Dublin"));

如果我介绍时间 06/22/2014 10:43 我就明白了

2014/06/22 8:43 +0100,

但我想得到

2014/06/22 10:43 +0100

我该怎么做?

java jodatime
3个回答
11
投票

您应该将时区应用于格式化程序,而不是

DateTime
。否则,日期将已经在您当地的时区中解析,您只需将其转换为您想要的时区。

DateTimeFormatter fmt = DateTimeFormat.forPattern("M/d/yyyy HH:mm")
                        .withZone(DateTimeZone.forID("Europe/Dublin"));
DateTime dt = fmt.parseDateTime("06/22/2014 10:43");

1
投票

看这个扩展代码:

String s = "06/22/2014 10:43";
DateTimeFormatter fmt = DateTimeFormat.forPattern("M/d/yyyy HH:mm"); // uses local zone
DateTime dt1 = fmt.parseDateTime(s).withZone(DateTimeZone.forID("Europe/Dublin"));
DateTime dt2 = fmt.withZone(DateTimeZone.forID("Europe/Dublin")).parseDateTime(s);
DateTime dt3 =
  fmt.parseDateTime(s).withZoneRetainFields(DateTimeZone.forID("Europe/Dublin"));
System.out.println(dt1); // 2014-06-22T09:43:00.000+01:00 (from my zone Berlin to Dublin)
System.out.println(dt2); // 2014-06-22T10:43:00.000+01:00
System.out.println(dt3); // 2014-06-22T10:43:00.000+01:00

0
投票

java.time

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

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

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

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

您的日期时间字符串,

06/22/2014 10:43
没有时区信息;因此,将其解析为
LocalDateTime
对象,然后使用
LocalDateTime#atZone
.

添加时区信息。

演示:

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter parser = DateTimeFormatter.ofPattern("M/d/yyyy HH:mm");
        LocalDateTime ldt = LocalDateTime.parse("06/22/2014 10:43", parser);
        System.out.println(ldt);
        ZonedDateTime zdt = ldt.atZone(ZoneId.of("Europe/Dublin"));
        System.out.println(zdt);

        // If you need just the time zone offset
        OffsetDateTime odt = zdt.toOffsetDateTime();
        System.out.println(odt);

        // Custom formatting
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm Z");
        String formatted = odt.format(formatter);
        System.out.println(formatted);
    }
}

输出:

2014-06-22T10:43+01:00[Europe/Dublin]
2014-06-22T10:43+01:00[Europe/Dublin]
2014-06-22T10:43+01:00
06/22/2014 10:43 +0100

在线演示

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

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