在 Java 中获取带时区的特定日期

Getting specific date with timezone in Java

我对 Java 中的日期和时间库有点着迷。基本上我需要的是获得两个字符串日期,第一个对应于澳大利亚时间的前一天(考虑到夏令时),具有特定的时间(将作为参数出现)并具有以下日期格式:"yyyy-MM-dd'T'HH:mm:ss.SSS zzz".

考虑一下,我将接收如下字符串形式的时间:"180000"。因此,如果今天是澳大利亚的 11 月 17 日,我将需要获取以下字符串:

"2017-11-16T18:00:00.000 AEDT"

而我需要的第二个字符串日期是 au 时间中与今天相同的日期:

"2017-11-17T18:00:00.000 AEDT"

我不会用JDK8,我必须用JDK7.

我尝试了不同的方法,但我没有得到我需要的东西。任何建议都会很棒。

看到你的评论说不能用Java8,必须用JDK7。同时,特别是对于不太琐碎的运行-of-the-像您这样的工厂操作,java.time,2014 年 Java 8 推出的现代 Java 日期和时间 API 更易于使用。幸运的是,现代 API 也被移植到 Java 6 和 7,在 ThreeTen Backport (that’s ThreeTen for JSR-310 中,API 首次被描述)。因此,我鼓励您获取反向移植并开始编码:

    ZoneId australianTime = ZoneId.of("Australia/Sydney");
    DateTimeFormatter receivedTimeFormat = DateTimeFormatter.ofPattern("HHmmss");
    DateTimeFormatter neededDateTimeFormatter 
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS zzz", 
                                          Locale.forLanguageTag("en-AU"));
    LocalDate today = LocalDate.now(australianTime);
    LocalDate yesterday = today.minusDays(1);
    String receivedTimeString = "180000";
    LocalTime time = LocalTime.parse(receivedTimeString, receivedTimeFormat);
    String previousDayAtTime = yesterday.atTime(time)
            .atZone(australianTime)
            .format(neededDateTimeFormatter);
    System.out.println(previousDayAtTime);

当我今天 运行 这个片段时,它打印了昨天请求的输出:

2017-11-16T18:00:00.000 AEDT

我相信你今天也会这样做。

由于您要求的结果中包含 AEDT,因此我选择 Australia/Sydney 作为时区而不是 Australia/Darwin 或其他澳大利亚选项。

使用 backport 也是面向未来的解决方案:只有在有一天升级到 Java 8 或更高版本(Java 9 已经出来)之前,您才需要 backport。升级时,只需将 import 语句从 org.threeten.bp 更改为 java.time