我对Java中的日期和时间库有点着迷。基本上,我需要的是获得两个字符串日期,第一个对应于澳大利亚时间的前一天(考虑到夏令时),带有特定的小时(将作为参数),日期格式如下:"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,必须使用JDK 7。同时,特别是对于像您的java.time
这样不太琐碎的运行操作,2014年随Java 8推出的现代Java日期和时间API非常适合使用。幸运的是,现代的API已经在ThreeTen Backport中向后移植到Java 6和7(这是JSR-310的ThreeTen,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,我选择了澳大利亚/悉尼作为时区,而不是澳大利亚/达尔文或其他澳大利亚选项。
使用backport也是未来的解决方案:您只需要使用backport,直到有一天升级到Java 8或更高版本(Java 9已经推出)。升级时,只需将import
语句从org.threeten.bp
更改为java.time
即可。