当日期中包含EDT / EST时,我们是否有任何API可以验证日期是否有效。我已经尝试过用Java Java SimpleDateFormat进行Joda,但是我无法解析日期。
下面是我正在获取“ 2017/09/25 16:18:15.099 -0400 EDT”的示例格式。
任何帮助表示赞赏。
谢谢,sk
您是否尝试阅读文档?
从以下文档中DateTimeFormatter:
DateTimeFormatter
z time-zone name zone-name Pacific Standard Time; PST x zone-offset offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
区域名称 :这将输出时区ID的显示名称。如果字母数为一,二或三,则输出简称。… 偏移X和x :这将根据图案字母的数量设置偏移格式。…两个字母输出小时和分钟,不带冒号,例如’+0130’。…
区域名称 :这将输出时区ID的显示名称。如果字母数为一,二或三,则输出简称。…
偏移X和x :这将根据图案字母的数量设置偏移格式。…两个字母输出小时和分钟,不带冒号,例如’+0130’。…
因此,我们尝试:
ZonedDateTime zdt = ZonedDateTime.parse("2017/09/25 16:18:15.099 -0400 EDT", DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm:ss.SSS xx zzz", Locale.ENGLISH));
产生ZonedDateTime的2017-09-25T16:18:15.099-04:00[America/New_York]。
ZonedDateTime
2017-09-25T16:18:15.099-04:00[America/New_York]
验证方式
在上面的代码中,ZonedDateTime从字符串中选取时区,并忽略偏移量。为了验证两者是否一致,我们可以将相同的字符串解析为a ZonedDateTime和an OffsetDateTime并进行比较。后者获取偏移量,并忽略时区缩写,因此可以使用:
OffsetDateTime
String inputDateTimeWithZone = "2017/09/25 16:18:15.099 -0400 EDT"; DateTimeFormatter formatterWithOffsetAndZone = DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm:ss.SSS xx zzz", Locale.ENGLISH); ZonedDateTime zdt = ZonedDateTime.parse(inputDateTimeWithZone, formatterWithOffsetAndZone); OffsetDateTime odt = OffsetDateTime.parse(inputDateTimeWithZone, formatterWithOffsetAndZone); if (! zdt.toOffsetDateTime().equals(odt)) { System.err.println("Offset does not match: is " + odt.getOffset() + ", but time zone " + zdt.getZone() + " implies offset " + zdt.getOffset()); }
尽量避免使用三个字母的时区缩写
EST和EDT还可分别用于澳大利亚东部标准时间和夏令时。三个字母的时区缩写不标准化,并且常常不明确。如果您可以获取具有时区ID的 地区/城市 格式的字符串(例如America / New_York),或者只是删除缩写并仅依赖偏移量,则这样做会更安全,因为这是明确的。
现代Java日期和时间API
今天,我推荐java.time在Joda-Time上使用AKA JSR-310,当然在长期过时的课程上SimpleDateFormat也是如此Date。对我来说,使用它非常好,而且当然不会像以前那样令人惊讶。它是Java 8和更高版本内置的。如果使用Java 6或7,则一开始可能会考虑使用Joda-Time,但是如果您准备接受外部依赖关系,为什么不采用ThreeTen Backport,即java.timeJava 6和7 的backport ?
java.time
SimpleDateFormat
Date