小编典典

带有时区的Java日期验证器

java

当日期中包含EDT / EST时,我们是否有任何API可以验证日期是否有效。我已经尝试过用Java Java
SimpleDateFormat进行Joda,但是我无法解析日期。

下面是我正在获取“ 2017/09/25 16:18:15.099 -0400 EDT”的示例格式。

任何帮助表示赞赏。

谢谢,sk


阅读 269

收藏
2020-11-26

共1个答案

小编典典

您是否尝试阅读文档?

以下文档中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’。…

因此,我们尝试:

    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));

产生ZonedDateTime2017-09-25T16:18:15.099-04:00[America/New_York]

验证方式

在上面的代码中,ZonedDateTime从字符串中选取时区,并忽略偏移量。为了验证两者是否一致,我们可以将相同的字符串解析为a
ZonedDateTime和an 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

2020-11-26