localdatetime - manejo de horas en java
¿Cómo formatear un período en Java 8/jsr310? (4)
Me gustaría formatear un Period
usando un patrón como YY years, MM months, DD days
. Las utilidades en Java 8 están diseñadas para formatear el tiempo, pero no el período ni la duración. Hay un PeriodFormatter
en tiempo de Joda. ¿Tiene Java utilidades similares?
No es necesario usar String.format()
para el formato de cadena simple. El uso de la concatenación de cadenas simples sin formato será optimizado por JVM:
Function<Period, String> format = p -> p.getYears() + " years, " + p.getMonths() + " months, " + p.getDays() + " days";
Una solución es simplemente utilizar 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());
Si realmente necesita usar las funciones de DateTimeFormatter
, puede usar una fecha LocalDate
temporal, pero este es un tipo de piratería que distorsiona la semántica de la fecha 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);
la forma correcta parece ser un objeto LocalDate intermedio y luego un formato de llamada
date1.format(DateTimeFormatter.ofPattern("uuuu MM LLLL ee ccc"));
OR (where appropriate)
date1.format(DateTimeFormatter.ofPattern("uuuu MM LLLL ee ccc", Locale.CHINA))
esto imprime 1997 01 一月 07 周六
en chino, 1997 01 January 01 Sun
1997 01 一月 07 周六
en inglés y 1997 01 januari 07 zo
en holandés.
visite DateTimeFormatter en "Patrones para el formateo y análisis" para obtener el formato deseado.
public static final String format(Period period){
if (period == Period.ZERO) {
return "0 days";
} else {
StringBuilder buf = new StringBuilder();
if (period.getYears() != 0) {
buf.append(period.getYears()).append(" years");
if(period.getMonths()!= 0 || period.getDays() != 0) {
buf.append(", ");
}
}
if (period.getMonths() != 0) {
buf.append(period.getMonths()).append(" months");
if(period.getDays()!= 0) {
buf.append(", ");
}
}
if (period.getDays() != 0) {
buf.append(period.getDays()).append(" days");
}
return buf.toString();
}
}