Java将localDate 0001-01-01转换为日期的问题

6 浏览
0 Comments

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

0
0 Comments

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的信息。

0