带有时区的Java日期验证器

时间:2017-11-13 20:20:36

标签: java apache date

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

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

感谢任何帮助。

谢谢, SK

1 个答案:

答案 0 :(得分:0)

您是否尝试阅读文档?

来自the documentation of DateTimeFormatter

    ; for i := 0 to (L-1)
    xor     edi,edi         ; index i
input_loop:
    cmp     edi,[lengthA]
    jge     input_loop_ends ; if (i >= L), end for

    ; TODO: Prompt for and input A[i]
    ; eax = input value, preserve edi (!)
    mov     [A + 4*edi],eax ; store value into A[i]

    ; end for
    inc     edi             ; ++i
    jmp     input_loop

input_loop_ends:
    ; memory at address A contains L many DWORD values from user
  

区域名称:输出时区ID的显示名称。如果字母数是一,二或三,那么短名称是   输出。 ...

     

偏移X和x :根据图案字母的数量格式化偏移。 ...两个字母输出小时和分钟,没有   冒号,例如' + 0130'。 ...

让我们试试看:

 z     time-zone name   zone-name     Pacific Standard Time; PST
 x     zone-offset      offset-x      +0000; -08; -0830; -08:30; -083015; -08:30:15;

这会产生 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]从字符串中选取时区并忽略偏移量。为了验证两者是否一致,我们可以将同一个字符串解析为ZonedDateTimeZonedDateTime并进行比较。后者获取偏移量并忽略时区缩写,因此这将起作用:

OffsetDateTime

避免使用三个字母的时区缩写

EST和EDT也可分别用于澳大利亚东部标准和日光时间。三个字母的时区缩写不是标准化的,通常是模糊的。如果你能得到一个带有 region / city 格式的时区ID的字符串(比如America / New_York),或者你只是简单地剥离了缩写并仅仅依赖于偏移,那么会更安全这是明确的。

现代Java日期和时间API

今天我推荐 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()); } ,AKA JSR-310,而不是Joda-Time,当然还有长期过时的课程java.timeSimpleDateFormat。事实证明,与我合作是非常好的,而且它肯定不会带来旧课程的惊喜。它内置于Java 8及更高版本。如果使用Java 6或7,您可能最初会考虑使用Joda-Time,但如果您已准备好接受外部依赖,那么为什么不将Date的{​​{1}}移回Java 6和7?