Java将localDate 0001-01-01转换为日期的问题
Java将localDate 0001-01-01转换为日期的问题
我有两个LocalDate需要转换:2022-11-02 和 0001-01-01。\n我正在使用相同的方法:\n
Date.from(myLocalDate.atStartOfDay(ZoneId.systemDefault()).toInstant())
\nLocalDate 2022-11-02 的结果是正确的 2022-11-02T04:00:00.000+00.00
\n然而,0001-01-01 的结果是 0001-01-03T05:17:32.000+00.00
\n这是因为 0001-01-01 不是一个有效的日期吗?如何将其转换为 0001-01-01T04:00:00.000+00.00
?
Java中将LocalDate 0001-01-01转换为Date的问题是因为Java的旧版Date-Time API和格式化API(SimpleDateFormat)已经过时且容易出错。建议完全停止使用它们,转而使用现代的Date-Time API。
从你的问题中,我推断出你的时区偏移是-04:00。你可以应用固定的偏移来实现你想要的结果。
以下是一个示例代码:
import java.time.LocalDate; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.util.stream.Stream; class Main { public static void main(String[] args) { Stream.of("2022-11-02", "0001-01-01") .map(LocalDate::parse) .map(date -> date.atStartOfDay()) .map(ldt -> ldt.atOffset(ZoneOffset.of("-04:00"))) .map(odt -> odt.withOffsetSameInstant(ZoneOffset.UTC)) .map(OffsetDateTime::toInstant) .forEach(System.out::println); } }
输出结果为:
2022-11-02T04:00:00Z
0001-01-01T04:00:00Z
如果需要格式化输出,可以使用`DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxxx")`,示例如下:
class Main { public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxxx", Locale.ENGLISH); Stream.of("2022-11-02", "0001-01-01") .map(LocalDate::parse) .map(date -> date.atStartOfDay()) .map(ldt -> ldt.atOffset(ZoneOffset.of("-04:00"))) .map(odt -> odt.withOffsetSameInstant(ZoneOffset.UTC)) .map(odt -> odt.format(formatter)) .forEach(System.out::println); } }
输出结果为:
2022-11-02T04:00:00.000+00:00 0001-01-01T04:00:00.000+00:00
你可以从[Java官方文档](https://docs.oracle.com/javase/tutorial/datetime/index.html)了解更多关于现代Date-Time API的信息。