web-dev-qa-db-fra.com

Comment formater une période en Java 8/jsr310?

Je voudrais formater un Period en utilisant un modèle comme YY years, MM months, DD days. Les utilitaires de Java 8 sont conçus pour formater l’heure, mais ni la période ni la durée. Il y a une PeriodFormatter in Joda time. Est-ce que Java a des utilitaires similaires?

21
naXa

Une solution consiste simplement à utiliser 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 vous devez vraiment utiliser les fonctionnalités de DateTimeFormatter , vous pouvez utiliser un LocalDate temporaire, mais c'est une sorte de bidouille qui déforme la sémantique de 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);
15
Ortomala Lokni

Il n'est pas nécessaire d'utiliser String.format() pour le formatage de chaîne simple. L'utilisation de la concaténation de chaînes ancienne et simple sera optimisée par JVM:

Function<Period, String> format = p -> p.getYears() + " years, " + p.getMonths() + " months, " + p.getDays() + " days";
5
oleg.cherednik
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();
    }
}
2
Luk

la manière appropriée semble être un objet LocalDate intermédiaire puis un format d'appel

date1.format(DateTimeFormatter.ofPattern("uuuu MM LLLL ee ccc"));
OR (where appropriate)
date1.format(DateTimeFormatter.ofPattern("uuuu MM LLLL ee ccc", Locale.CHINA))

this imprime 1997 01 一月 07 周六 en chinois, 1997 01 January 01 Sun en anglais et 1997 01 januari 07 zo en néerlandais.

consultez https://docs.Oracle.com/javase/8/docs/api/Java/time/format/DateTimeFormatter.html sous "Patterns for Formatting and Parsing" pour le formatage souhaité.

0
RecurringError