如何在 Java 中转换 Julian 日期(序号日期)

how to convert Julian date (ordinal date) in Java

要求:获取Julian format (ordinal date)中的日期,与当前日期进行比较,从中获取月份和年份。

将其转换为输出格式。

输入格式:yydddd
输出格式:yymm

JDK 8

我能做的一种方法是使用日期:

Date myDateWrong = new SimpleDateFormat("yyyyddd").parse("2020366");

有更干净的方法吗?

java.time

looking for java.time.* solution which can parse yyyyddd format

这也是我推荐的。

    DateTimeFormatter dayOfYearFormatter
            = DateTimeFormatter.ofPattern("uuuuDDD");
    DateTimeFormatter yearMonthFormatter
            = DateTimeFormatter.ofPattern("uuMM");

    String yyyydddString = "2020366";
    LocalDate date = LocalDate.parse(yyyydddString, dayOfYearFormatter);
    String output = date.format(yearMonthFormatter);

    System.out.println(output);

输出为:

2012

所以 2020 年 12 月

你的代码出了什么问题?

无论您使用现代的 DateTimeFormatter 还是古老而麻烦的 SimpleDateFormat,小写的 d 是代表月 的日期 和大写的 D 日。为什么它与 SimpleDateFormat 一起工作是因为如果没有给出月份,class 令人困惑地将月份默认为一月。所以你的日期被解析为一月的第 366 天。什么?!没错,SimpleDateFormat 的另一个令人困惑的特征是,在默认设置下它很乐意解析不存在的日期。当 1 月只有 31 天时,它只是推算到接下来的几个月,并在您预期的 12 月 31 日结束。 SimpleDateFormat 充满了像这样令人讨厌的惊喜。我建议您永远不要再使用那个 class。

Link

Oracle tutorial: Date Time 解释如何使用 java.time.