我正在编写一个方法,它将采用 java.time.LocalDate
并生成 Julian 日期变体。儒略日期变体格式如下:
CYYDDD
C
是世纪,YY
是 2 位数年份,DDD
是 3 位数日期。今天(2021 年 12 月 8 日)转换为 121342。
我正在使用 java.util.Formatter
来格式化 LocalDate
中的值,如下所示:
private int calculateJDEDate(LocalDate date) {
StringBuilder sb = new StringBuilder();
Formatter fmt = new Formatter(sb);
// Format 2 digit year.
fmt.format("%.2d", date.getYear()).close();
// fmt.format("1%1$.2d%2$.3d", date.getYear(), date.getDayOfYear()).close();
return Integer.parseInt(sb.toString());
}
getYear()
和 getDayOfYear()
方法都返回一个 int 值。
当我尝试运行它时,出现以下异常:
Exception in thread "main" java.util.IllegalFormatPrecisionException: 2
at java.base/java.util.Formatter$FormatSpecifier.checkInteger(Formatter.java:3138)
at java.base/java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2874)
at java.base/java.util.Formatter.parse(Formatter.java:2713)
at java.base/java.util.Formatter.format(Formatter.java:2655)
at java.base/java.util.Formatter.format(Formatter.java:2609)
at com.fossfloors.f55hubdt.Main.calculateJDEDate(Main.java:104)
at com.fossfloors.f55hubdt.Main.calculateDateData(Main.java:96)
at com.fossfloors.f55hubdt.Main.lambda$0(Main.java:129)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.base/java.util.stream.LongPipeline$1$1.accept(LongPipeline.java:177)
at java.base/java.util.stream.Streams$RangeLongSpliterator.forEachRemaining(Streams.java:228)
at java.base/java.util.Spliterator$OfLong.forEachRemaining(Spliterator.java:763)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.forEachOrdered(ReferencePipeline.java:502)
at com.fossfloors.f55hubdt.Main.main(Main.java:128)
我不明白哪里出了问题。我发现的每个例子都表明这种格式是有效的。
这是一个次要问题,但格式化程序是否允许使用前导字符(如前导零)?我似乎找不到有关这样做的信息。
最佳答案
问题是 %.2d
没有意义,因为它指定了小数的精度(小数点后的小数位数),而根据定义,整数没有小数值。您可能会想到 %02d
和 %03d
,但它们仅指定了最小宽度。
相反,使用 java.time.DateTimeFormatter
:
var date = LocalDate.of(2021, 12, 8);
var formatter = DateTimeFormatter.ofPattern("yyDDD");
System.out.println("1" + formatter.format(date));
如果世纪是固定的(始终为 1),那么您还可以使用模式 "'1'yyDDD"
并取消连接。
关于java - 如何用一组特定的数字格式化整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70279704/