【问题标题】:how to convert Julian date (ordinal date) in Java [duplicate]如何在Java中转换儒略日期(序数日期)[重复]
【发布时间】:2020-04-30 04:17:09
【问题描述】:

要求:获取Julian格式(ordinal date)的日期,与当前日期比较,得到月份和年份。

将其转换为输出格式。

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

JDK 8

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

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

有什么更清洁的方法吗?

【问题讨论】:

标签: java julian-date date


【解决方案1】:

java.time

寻找可以解析 yyyyddd 格式的 java.time.* 解决方案

这也是我推荐的。

    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一年 /em>。无论如何它与SimpleDateFormat 一起工作的原因是,如果没有给出月份,该类会混淆地默认月份为一月。因此,您的日期被解析为 1 月的第 366 天。什么?!没错,SimpleDateFormat 的另一个令人困惑的特性是,使用默认设置它可以愉快地解析不存在的日期。当 1 月只有 31 天时,它只是外推到接下来的几个月,并在 12 月 31 日结束,即您预期的那一天。 SimpleDateFormat 充满了这些令人讨厌的惊喜。我建议你永远不要再使用那个类。

链接

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    相关资源
    最近更新 更多