java - 如何用一组特定的数字格式化整数?

标签 java

我正在编写一个方法,它将采用 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/

相关文章:

java - apache httpclient 4.3 没有超时

java - 如何使用 Apache Flink 解决 com.esotericsoftware.kryo.Kryo.readObject 处的 NPE?

java - Apache Shiro - Maven 项目中的主题始终为空

java - ImageView隐藏父级的圆角

java - 嵌套异常是 org.springframework.beans.TypeMismatchException :

java.lang.OutOfMemoryError : Java heap space, 如何释放内存?

java - 这是 Java 中接口(interface)的正确结构吗?

java - 如何降低圈复杂度?

Java:从服务器而不是系统时钟获取当前日期和时间

java - 静态方法,静态变量可以在Web应用程序中被多个线程改变 - jsp