在 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
。
我对 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
。