繁体   English   中英

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

[英]Getting specific date with timezone in Java

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

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

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

我需要的第二个字符串日期是在澳大利亚时间今天的同一天:

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

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

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

我看到您的评论,即您不能使用Java 8,必须使用JDK7。与此同时,特别是对于不太琐碎的java.time操作,例如您的java.time ,现代Java日期和时间API, Java 8于2014年问世,使用起来非常好。 幸运的是,在ThreeTen Backport (也就是JSR-310的ThreeTen,首次描述了API)中,现代API也已经被反向移植到Java 6和Java 7。 因此,我鼓励您获取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.bpjava.time

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM