如何在Java 8/jsr310中格式化Period?

naX*_*aXa 21 java time-format period java-8

我想Period使用像这样的模式来格式化YY years, MM months, DD days.Java 8中的实用程序旨在设置时间格式,但不包括句点或持续时间.PeriodFormatter在Joda时间有一个.Java有类似的实用程序吗?

Ort*_*kni 15

一种解决方案是简单地使用String.format:

import java.time.Period;

Period p = Period.of(2,5,1);
String.format("%d years, %d months, %d days", p.getYears(), p.getMonths(), p.getDays());
Run Code Online (Sandbox Code Playgroud)

如果你真的需要使用的功能DateTimeFormatter,你可以使用一个临时的LocalDate,但这是一种扭曲语义的黑客LocalDate.

import java.time.Period;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

Period p = Period.of(2,5,1);
DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("y 'years,' M 'months,' d 'days'");
LocalDate.of(p.getYears(), p.getMonths(), p.getDays()).format(fomatter);
Run Code Online (Sandbox Code Playgroud)

  • 我不喜欢看到`LocalDate`用作黑客.为什么不使用Java中的String工具进行具有值替换方法的相同占位符? (2认同)
  • 我同意扭曲"LocalDate"的语义并不优雅,可能会导致问题. (2认同)

ole*_*nik 5

没有必要使用String.format()简单的字符串格式.使用普通的旧字符串连接将由JVM优化:

Function<Period, String> format = p -> p.getYears() + " years, " + p.getMonths() + " months, " + p.getDays() + " days";
Run Code Online (Sandbox Code Playgroud)

  • 只想知道在这种情况下使用普通的旧方法声明会出什么问题吗? (2认同)
  • 我个人认为,在这种情况下,`String.format()`版本更容易阅读。 (2认同)