2 votes

Le symbole "F" du DateTimeFormatter de Java 8

Sur java.time.format.DateTimeFormatterBuilder :

/** Map of letters to fields. */
private static final Map<Character, TemporalField> FIELD_MAP = new HashMap<>();

static {
    // SDF = SimpleDateFormat
    // ...
    FIELD_MAP.put('F', ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH);  // SDF, LDML
    // ...
}

Il montre que le symbole "F" peut avoir la même signification dans SimpleDateFormatter(SDF).

Dans le SDF, le symbole "F" signifie l'ordinal du jour de la semaine désigné, tel que "le deuxième dimanche de mai", la fête des mères (États-Unis).
Avec le SDF, je peux définir la fête des mères (US) en 2021 par "2021-05-2-Sun" avec le motif "yyyy-MM-F-EEE".
Mais tout motif comportant le symbole "F" avec DateTimeFormatter peut provoquer une DateTimeParseException.
J'ai trouvé un problème qui est déjà "résolu" :
[JDK-8169482]javadoc de java.time.DateTimeFormatter : F n'est pas semaine du mois
Mais cela n'a fait que "corriger" la javadoc ! ( ° ° ;)
Le symbole "F" est toujours avec un comportement non défini.

La description confuse dans le FSD "F : Jour de la semaine dans le mois" peut en être la raison.

3voto

Sweeper Points 1267

Étant donné que la résolution du bogue consistait à corriger la documentation, plutôt qu'à corriger la DateTimeFormatter il semble que l'implémentation de F signification ALIGNED_DAY_OF_WEEK_IN_MONTH est en fait prévu, et c'est seulement que le // SDF Le commentaire n'a pas été corrigé.

Et parce que cela signifie ALIGNED_DAY_OF_WEEK_IN_MONTH Une date telle que "2021-05-2-Sun" n'a pas beaucoup de sens. Vous n'avez donné que le mois, l'année et le jour de la semaine. Ce ne sont pas des informations suffisantes pour déterminer quel jour du mois nous sommes. Cela ne se produit pas avec "2021-05-2-Sun", mais dans des cas comme "2021-05-2-Mon", le jour de la semaine (Mon), et le jour de la semaine aligné (2) peuvent même dire des choses différentes sur le jour de la semaine que cela devrait être. :)

Pour analyser un "nième jour de la semaine", il faut ALIGNED_WEEK_OF_MONTH qui DateFormatter n'a pas de symbole pour. (Notez que W est le non aligné semaine du mois). Mais ne vous inquiétez pas, vous pouvez ajouter n'importe quelle valeur de TemporalField dans le modèle avec appendValue :

DateTimeFormatter formatter =
    new DateTimeFormatterBuilder()
        .appendPattern("yyyy-MM-")
        .appendValue(ChronoField.ALIGNED_WEEK_OF_MONTH)
        .appendPattern("-EEE").toFormatter(Locale.ENGLISH);

Utilisation :

System.out.println(LocalDate.parse("2021-05-2-Sun", formatter));
// 2021-05-09

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X