当前位置: 首页 > 面试题库 >

带有时区的Java日期验证器

甄鹏云
2023-03-14
问题内容

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

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

任何帮助表示赞赏。

谢谢,sk


问题答案:

您是否尝试阅读文档?

从以下文档中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



 类似资料:
  • 我正在尝试在中解析这些日期,然后获取表示形式。 我阅读了这个类似的答案,并创建了一个方法来解析上述日期并返回具有所需格式的: 然而,没有一个图案是匹配的。我这里缺少什么? 更新:在这两个日期中,我都收到了字符的异常。

  • 问题内容: 无论如何,是否可以验证给定日期(yyyy-MM- dd)是否为有效日期?它也应该处理leap年。例如(2015-02-29)应该无效。我将日期作为字符串检索,并将其放入joda DateTime对象。 问题答案: 我认为,这应该对您有用(如果您想保持简单)。 你必须做一个。

  • 我想以我用命令设置的格式传入日期。这是我到目前为止所尝试的。不理解无效月份错误。我在用10克。 数据库时区为UTC 我设置了会话时区和日期格式

  • 使用spring我有这个endpoint, 带有日期字段的对象的Spring验证失败

  • 我正在尝试将日期插入我的PostgreSQL数据库。以下是我在java应用程序中解析日期的方式: 在我的PostgreSQL数据库中。我将其作为带有时区的。处理和插入它的理想方式是什么? 数据库期望的示例。

  • 我有一个带时区的日期(如2014年3月21日08:00:00)(“如美国/丹佛”),我想将该日期转换为格林尼治标准时间;我怎么能这样做? 我还想知道Oracle是否接受DST?它会自动处理吗?是否以相同的方式支持所有时区? 注:“来自时区”在每种情况下都会改变;所以,并不总是美国/丹佛