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

时间:2017-11-16 23:09:27

标签: java date datetime timezone datetime-format

我对Java中的日期和时间库感到有点疯狂。基本上我需要的是获得两个String日期,第一个对应于澳大利亚时间的前一天(考虑到日光时间),具有特定小时(将作为参数)并具有以下日期格式:{{1 }}

考虑我会收到如下字符串的时间:"yyyy-MM-dd'T'HH:mm:ss.SSS zzz"。因此,如果今天是11月17日在澳大利亚,我将需要获得以下字符串:

"180000"

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

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

我无法使用JDK 8,我必须使用JDK 7.

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

1 个答案:

答案 0 :(得分:2)

我看到你的评论说你不能使用Java 8,你必须使用JDK 7.同时,特别是对于像你这样的普通Java,java.time这样的普通Java操作日期和时间2014年推出Java 8的API可以更好地使用。幸运的是,现代API已经被移植到Java 6和7,ThreeTen Backport(这是JSR-310的ThreeTen,其中首先描述了API)。所以我鼓励你得到backport并开始编码:

    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,我选择澳大利亚/悉尼作为澳大利亚/达尔文或其他澳大利亚选项的时区。

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