带时区的Java日期验证程序
当日期中包含EDT/EST时,我们是否有任何API来验证日期是否有效。我试过使用Joda、Java SimpleDateFormat,但无法解析日期 下面是我得到的“2017/09/25 16:18:15.099-0400 EDT”的样本格式 感谢您的帮助 谢谢,带时区的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” 让我们试试看
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!请随意在勾号上标记为已接受。请看,我不想听起来很贪婪。你也可以养成这样的习惯,当你接受他们的答案时,有些人会非常感激。