日期类型转换
DateTypeConvert 可转换传统 Date、Calendar、SQL 日期类型、毫秒时间戳以及 Java 8 的 java.time 类型。凡是涉及本地日期时间的转换,都应明确传入 ZoneId。
Instant instant = Instant.now();
ZoneId zone = ZoneId.of("Asia/Shanghai");
LocalDateTime local = new DateTypeConvert(instant).to(LocalDateTime.class, zone);
Calendar calendar = new DateTypeConvert(instant).to(Calendar.class, zone);
重要语义
- 时间戳
0是合法输入,表示1970-01-01T00:00:00Z。 - 纯日期字符串按日期格式解析,不再强制套用日期时间格式。
- 日期解析与格式化输出使用不同的 formatter;解析采用严格模式,
2023-02-29等非法日期会抛出解析异常,不会被静默调整。 LocalDate转换为LocalDate时原样返回,不应用时区规则,因此不会因目标时区的跳日规则而改变日期。- 转换得到的
Calendar会使用调用方指定的时区。 Calendar作为输入且未指定ZoneId时,会保留输入对象自身的时区;显式传入的ZoneId优先。- 输入与目标同为
ZonedDateTime或OffsetDateTime时会原样返回,保留原始时区或 offset。 LocalDateTime转换为瞬时时采用严格规则:夏令时缺口会被拒绝,重叠时间也会因歧义被拒绝,不会静默选择某个 offset。OffsetTime本身不含日期,只能转换为OffsetTime或LocalTime;需要日期的瞬时转换会被拒绝,不再隐式补系统“今天”。LocalTime会原样转换为LocalTime;只有显式提供固定 offset 时才能转换为OffsetTime,需要日期的其他转换会被拒绝。
Instant epoch = new DateTypeConvert(0L).to(Instant.class, ZoneOffset.UTC);
assertEquals(Instant.EPOCH, epoch);
没有输入或转换缺少必要上下文时,API 会抛出异常,而不是静默猜测。