web-dev-qa-db-fra.com

Comment formater l'objet LocalDate au format MM/jj/aaaa et conserver le format

Je lis un texte et stocke les dates sous forme de variables LocalDate. 

Est-il possible pour moi de conserver la mise en forme à partir de DateTimeFormatter afin que, lorsque j'appelle la variable LocalDate, elle reste dans ce format?.

EDIT: je veux que parsedDate soit stocké dans le format correct du 25/09/2016 plutôt que sous forme de chaîne

Mon code:

public static void main(String[] args) 
{
    LocalDate date = LocalDate.now();
    DateTimeFormatter formatters = DateTimeFormatter.ofPattern("d/MM/uuuu");
    String text = date.format(formatters);
    LocalDate parsedDate = LocalDate.parse(text, formatters);

    System.out.println("date: " + date); // date: 2016-09-25
    System.out.println("Text format " + text); // Text format 25/09/2016
    System.out.println("parsedDate: " + parsedDate); // parsedDate: 2016-09-25

    // I want the LocalDate parsedDate to be stored as 25/09/2016
}
4
MOZAKATAK

EDIT: Compte tenu de votre modification, il suffit de définir parsedDate égal à votre chaîne de texte formatée, comme suit:

parsedDate = text;

Un objet LocalDate peut uniquement être imprimé au format ISO8601 (aaaa-MM-jj). Pour imprimer l'objet dans un autre format, vous devez le formater et enregistrer LocalDate en tant que chaîne, comme vous l'avez montré dans votre propre exemple.

DateTimeFormatter formatters = DateTimeFormatter.ofPattern("d/MM/uuuu");
String text = date.format(formatters);
14
Rebecca Close

Réponse courte: non.

Réponse longue: Un LocalDate est un objet représentant une année, un mois et un jour, et ce sont les trois champs qu’il va contenir. Il n'a pas de format, car différents paramètres régionaux auront des formats différents, ce qui compliquera l'exécution des opérations que l'on voudrait effectuer sur un LocalDate (comme ajouter ou soustraire des jours ou des heures).

La représentation de chaîne (produite par toString()) est la norme internationale sur la façon d’imprimer les dates. Si vous souhaitez un format différent, vous devez utiliser un DateTimeFormatter de votre choix.

3
Joe C

Il suffit de formater la date tout en l’imprimant:

public static void main(String[] args) {
    LocalDate date = LocalDate.now();
    DateTimeFormatter formatters = DateTimeFormatter.ofPattern("d/MM/uuuu");
    String text = date.format(formatters);
    LocalDate parsedDate = LocalDate.parse(text, formatters);

    System.out.println("date: " + date);
    System.out.println("Text format " + text);
    System.out.println("parsedDate: " + parsedDate.format(formatters));
}
3
Wojciech Kazior

Cela pourrait être possible si vous pouviez étendre LocalDate et substituer la méthode toString() mais que la classe LocalDate est immuable et donc (secure oop) final. Cela signifie que si vous souhaitez utiliser cette classe, la seule méthode toString() que vous pourrez utiliser est la méthode ci-dessus (copiée à partir des sources LocalDate):

@Override
public String toString() {
    int yearValue = year;
    int monthValue = month;
    int dayValue = day;
    int absYear = Math.abs(yearValue);
    StringBuilder buf = new StringBuilder(10);
    if (absYear < 1000) {
        if (yearValue < 0) {
            buf.append(yearValue - 10000).deleteCharAt(1);
        } else {
            buf.append(yearValue + 10000).deleteCharAt(0);
        }
    } else {
        if (yearValue > 9999) {
            buf.append('+');
        }
        buf.append(yearValue);
    }
    return buf.append(monthValue < 10 ? "-0" : "-")
        .append(monthValue)
        .append(dayValue < 10 ? "-0" : "-")
        .append(dayValue)
        .toString();
}

Sidoitredéfinir ce comportement, vous pouvez encercler LocalDate et utiliser votre méthode toString personnalisée, mais cela pourrait entraîner plus de problèmes qu'il n'en résout!

0