java.time
我建议您使用 java.time(现代 Java 日期和时间 API)来进行日期工作。您需要的格式已内置。
LocalDate today = LocalDate.now(ZoneId.systemDefault());
String ordinalDateString = today.format(DateTimeFormatter.ISO_ORDINAL_DATE);
System.out.println(ordinalDateString);
2021 年 1 月 20 日今天的输出标准 ISO 8601 格式:
2021-020
你提到的格式,0YYDDD
,很奇特。这是我以前从未见过的。如果您认真对待它,请定义一个格式化程序来提供它:
DateTimeFormatter peculiarDateFormatter = DateTimeFormatter.ofPattern("0uuDDD");
021020
如果前三位数字 021 应该是年份的最后三位数字,那么 java.time 也可以做到这一点。还需要多说几句:
DateTimeFormatter peculiarDateFormatter = new DateTimeFormatterBuilder()
.appendValueReduced(ChronoField.YEAR, 3, 3, 1950)
.appendValue(ChronoField.DAY_OF_YEAR, 3)
.toFormatter();
对于 2021 年的日期,输出与以前相同。对于其他世纪的日期,第一位数字将不再是 0。
序数日期,而不是儒略日期
您要求的年份中的第几天称为序数日期,这就是为什么内置格式化程序还具有ordinal以它的名义。儒略日是另一回事,是自公元前 4713 年 1 月 1 日以来的连续天数。序数日期有时被称为 Julian,但它并没有什么真正的 Julian,所以为了避免混淆,更喜欢ordinal over Julian.
Links
-
Oracle 教程:日期时间解释如何使用 java.time。
-
朱利安日在维基百科上。
-
序数日期在维基百科上。