【问题标题】:Getting specific date with timezone in Java在 Java 中使用时区获取特定日期
【发布时间】:2017-11-16 23:09:26
【问题描述】:

我对 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"

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

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

【问题讨论】:

  • 前一天怎么可能是今天前两天?或者更确切地说,如果今天是 11 月 17 日,那么“今天的同一天”怎么可能是 2017 年 11 月 18 日? --- 顺便说一句:您正在寻找用于此的主要类是 ZonedDateTime
  • @Andreas 谢谢,只是一个错字
  • 顺便说一句,我无法使用 jdk8,我必须使用 jdk7
  • 在这种情况下,@fabrik,我强烈建议您在 JDK 7 中使用 ThreeTen Backport。这是现代 JSR-310 日期和时间 API 到 Java 6 和 7 的向后移植。跨度>

标签: java date datetime timezone datetime-format


【解决方案1】:

我看到你的评论说你不能使用 Java 8,你必须使用 JDK 7。同时,特别是对于像你这样不那么琐碎的普通操作,java.time,现代 Java 日期和2014 年与 Java 8 一起推出的 time 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);

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

2017-11-16T18:00:00.000 AEDT

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

由于您要求的结果中有 AEDT,因此我选择澳大利亚/悉尼作为时区,而不是澳大利亚/达尔文或其他澳大利亚选项。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 2016-03-12
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    相关资源
    最近更新 更多