如何在 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.
要求:获取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.