Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带时区的Java日期验证程序_Java_Apache_Date - Fatal编程技术网

带时区的Java日期验证程序

带时区的Java日期验证程序,java,apache,date,Java,Apache,Date,当日期中包含EDT/EST时,我们是否有任何API来验证日期是否有效。我试过使用Joda、Java SimpleDateFormat,但无法解析日期 下面是我得到的“2017/09/25 16:18:15.099-0400 EDT”的样本格式 感谢您的帮助 谢谢, sk您是否尝试阅读文档 发件人: 区域名称:输出时区ID的显示名称。如果字母计数为1、2或3,则短名称为 输出 偏移量X和X:这将根据图案字母的数量格式化偏移量…两个字母输出小时和分钟,不带数字 冒号,例如“+0130” 让我们试试看

当日期中包含EDT/EST时,我们是否有任何API来验证日期是否有效。我试过使用Joda、Java SimpleDateFormat,但无法解析日期

下面是我得到的“2017/09/25 16:18:15.099-0400 EDT”的样本格式

感谢您的帮助

谢谢,
sk

您是否尝试阅读文档

发件人:

区域名称:输出时区ID的显示名称。如果字母计数为1、2或3,则短名称为 输出

偏移量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));
这将产生2017-09-25T16:18:15.099-04:00[美国/纽约]的
分区日期时间

验证

在上面的代码中,
ZoneDateTime
从字符串中提取时区并忽略偏移量。为了验证两者是否一致,我们可以将同一字符串解析为
ZonedDateTime
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
,也称JSR-310,超过了Joda时间,当然也超过了早已过时的类
SimpleDataFormat
Date
。对我来说,它被证明是非常好的工作,它当然不会带来旧类的惊喜。它内置了Java8和更高版本。如果使用java 6或7,您可能首先会考虑JoDA时间,但是如果您准备接受外部依赖,为什么不使用“代码> java java的后端”?“时间<代码> > Java 6和7?< /p> < p>您尝试阅读文档吗?

发件人:

区域名称:输出时区ID的显示名称。如果字母计数为1、2或3,则短名称为 输出

偏移量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));
这将产生2017-09-25T16:18:15.099-04:00[美国/纽约]
分区日期时间

验证

在上面的代码中,
ZoneDateTime
从字符串中提取时区并忽略偏移量。为了验证两者是否一致,我们可以将同一字符串解析为
ZonedDateTime
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
,也称JSR-310,超过了Joda时间,当然也超过了早已过时的类
SimpleDataFormat
Date
。对我来说,它被证明是非常好的工作,它当然不会带来旧类的惊喜。它内置了Java8和更高版本。如果使用java 6或7,你可能会首先考虑JoDA时间,但是如果你准备接受外部依赖,为什么不接受“代码> java java的后端”,“时间<代码> > Java 6和7?< /p>“我不能解析日期”是什么意思?当你尝试时,哪里出了问题?是否有错误消息?最重要的是,您编写的代码在哪里?字符串中有偏移量(-0400)和三个字母的时区缩写(EDT)?以前从没见过。一切都是第一次。:-)“我无法解析日期”是什么意思?当你尝试时,哪里出了问题?是否有错误消息?最重要的是,您编写的代码在哪里?字符串中有偏移量(-0400)和三个字母的时区缩写(EDT)?以前从没见过。一切都是第一次。:-)很高兴看到@user8206257!请随意在勾号上标记为已接受。请看,我不想听起来很贪婪。你不妨养成这样的习惯,当你接受他们的答案时,一些StackOverflower会非常感激。很高兴读到这一点,@user8206257!请随意在勾号上标记为已接受。请看,我不想听起来很贪婪。你也可以养成这样的习惯,当你接受他们的答案时,有些人会非常感激。