在Java中使用时区获取特定日期

2022-07-21 00:00:00 datetime datetime-format date timezone java

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

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

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

我需要的第二个字符串日期与今天在au time中的日期相同:

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

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

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


解决方案

我看到您的评论,您不能使用Java 8,您必须使用JDK 7。同时,特别是对于像您这样不是很普通的操作,java.time,2014年Java 8推出的现代Java日期和时间API使用起来要好得多。幸运的是,现代的API也已经在ThreeTen Backport(即JSR-310的ThreeTen,API第一次被描述的地方)中被移植到了Java 6和7。因此,我鼓励您获得后端口并开始编码:

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

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

相关文章