Dav*_*len 7 java java-time zoneddatetime java.time.instant
我们有一个用于生成报告的库.它从数据文件(SQL,XML,JSON等)中读取,然后可以在用户编写的等式中修改日期时间,然后将其格式化为报告输出的指定.
等式中的使用可以添加一个时间跨度,获取值的一部分,如"if date.month == 2",以及Excel中的几乎所有日期时间宏.
因为数据可以是JSON(或没有架构的XML),所以日期时间可以是"2019-01-25","2019-01-25T14:32:23","2019-01-25T14:32:23.12345"," 2019-01-25T14:32:23Z",或"2019-01-25T14:32:23Z-0500"(最后两个也可以有".12345").
如果没有时区偏移,我们假设日期时间是UTC.虽然这应该是真的,但通常它不是,它是当地时间,但它的使用方式,无关紧要.因此,除非指定时区偏移,否则将其设为UTC(到目前为止,我们已使用Date).
第一个问题 - 我应该使用什么类来保持这个值?根据我的阅读,我认为ZonedDateTime,但也许是即时?
第二个问题 - 当我必须做3天加入日期时间时,我应该在什么课上使用?
第三个问题 - 是否有一些解析器可以解析上面列出的所有不同的字符串?或者我需要调用String.contains()来确定格式,然后根据它做一个显式模式?如果是这样,使用什么类?
第三个问题 - 是否有一些解析器可以解析我上面列出的所有不同的字符串?或者我是否需要调用 String.contains() 来确定格式,然后基于该格式执行显式模式?如果是这样,使用什么类?
我可能是大错特错,但你可以使用DateTimeFormatter模式和parseBest方法的可选部分:
List<String> dates = List.of(
"2019-01-25",
"2019-01-25T14:32:23",
"2019-01-25T14:32:23.12345",
"2019-01-25T14:32:23Z",
"2019-01-25T14:32:23Z-0500"
);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"yyyy-MM-dd['T'[HH:mm:ss][.SSSSS]][z][x]"
); // all the possible combinations
dates.forEach( date -> {
TemporalAccessor accessor = formatter.parseBest(date,
OffsetDateTime::from, // going from most specific date
LocalDateTime::from,
LocalDate::from); // to the less specific
System.out.println( accessor.getClass() + " " + accessor);
}
);
// output for this is
class java.time.LocalDate 2019-01-25
class java.time.LocalDateTime 2019-01-25T14:32:23
class java.time.LocalDateTime 2019-01-25T14:32:23.123450
class java.time.OffsetDateTime 2019-01-25T14:32:23Z
class java.time.OffsetDateTime 2019-01-25T14:32:23-05:00
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
546 次 |
| 最近记录: |