IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Numéro de semaine dans l'année, DateTimeFormatter, passage de Java 8 à Java 11


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut Numéro de semaine dans l'année, DateTimeFormatter, passage de Java 8 à Java 11
    Bonjour,

    J'ai un comportement différent suivant que je sois en Java 8 ou Java 11.

    Le problème est indirectement évoqué ici:
    https://stackoverflow.com/questions/...avior-jdk-8-11

    Le but est d'appliquer la norme ISO-8601:
    https://fr.wikipedia.org/wiki/Num%C3...O_des_semaines

    Voila, soit le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    import java.time.*;
    import java.time.format.DateTimeFormatter;
    import java.util.*;
     
    public class TestMain {
     
    	public static void main(String[] args) {
    		String test = "2016-01-01T06:00:00.000";
    		ZonedDateTime testDate = ZonedDateTime.parse(test, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS").withZone(ZoneId.of("UTC"))); 
    		DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("w").withZone(ZoneId.of("Europe/Paris")).withLocale(Locale.FRENCH);
    		String result = testDate.format(dateTimeFormatter);
    		System.out.println(result);
    	}
     
    }
    Je place la classe Java dans un dossier de Test:
    Nom : dev_2_1.jpg
Affichages : 962
Taille : 26,9 Ko

    Or, le résultat est différent suivant que je sois en Java 8 ou Java 11:
    Nom : dev_2_2.jpg
Affichages : 941
Taille : 35,6 Ko

    Nom : dev_2_3.jpg
Affichages : 951
Taille : 36,2 Ko

    Pour comprendre pourquoi, il faut avoir en tête les calendriers 2015 et 2016:

    Nom : dev_2_4.jpg
Affichages : 980
Taille : 189,5 Ko

    En Java 8, il considère que l'on considère que l'on compte la première semaine à partir du premier Lundi de Janvier. Donc la semaine 1 commence le lundi 4/01/2016.
    Les 1/01/2016, 2/01/2016 et 3/01/2016 font parties de la semaine 53 de l'année 2015.

    Mais en Java 11, il compte à partir du premier jour.
    Les 1/01/2016, 2/01/2016 et 3/01/2016 font partie de la semaine 1 de l'année 2016 et la semaine 2 commence le Lundi 4/01/2016.

    Cela me pose en particulier dans un test unitaire.
    La semaine du 1/02/2016 au 7/02/2016 est la semaine 5 or en Java 11, comme on compte les 1/01/2016, 2/01/2016 et 3/01/2016, ça devient la semaine 6.

    La réponse attendu est semaine 5, car c'est la norme ISO 8601

    Cordialement.

  2. #2
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut
    J'ai réussi à trouver la solution ici:
    https://stackoverflow.com/questions/...d-calendar-api

    En résumé, le code à écrire est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    package com.test;
     
    import java.time.ZoneId;
    import java.time.ZonedDateTime;
    import java.time.format.DateTimeFormatter;
    import java.time.temporal.IsoFields;
    import java.util.Locale;
     
    public class TestMain {
     
    	public static void main(String[] args) {
    		String test = "2016-01-01T04:00:00.000";
    		ZonedDateTime testDate = ZonedDateTime.parse(test, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS").withZone(ZoneId.of("UTC"))); 
    		DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("w").withZone(ZoneId.of("Europe/Paris")).withLocale(Locale.FRENCH);
    		String result = testDate.format(dateTimeFormatter);
    		System.out.println(result);
    		int myTest = testDate.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
    		System.out.println(myTest);
    	}
     
    }
    La console donne:
    Le 53, qui correspond à la bonne réponse est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int myTest = testDate.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);

  3. #3
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut
    Sur la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("w").withZone(ZoneId.of("Europe/Paris")).withLocale(Locale.FRENCH);
    En remplaçant Locale.FRENCH par Locale.FRANCE, on obtient également le bon résultat.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VB6 - Numéro de semaine dans l'année
    Par wilder1626 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 31/12/2018, 13h09
  2. Nbre de semaine dans une année
    Par kickoune dans le forum Excel
    Réponses: 21
    Dernier message: 07/06/2007, 12h04
  3. nombre de semaine dans l'année
    Par bnreb10 dans le forum Collection et Stream
    Réponses: 18
    Dernier message: 26/09/2006, 11h43
  4. Réponses: 6
    Dernier message: 25/09/2006, 14h51
  5. [Calendar] Problème de numéro de semaine de l'année
    Par gaia_dev dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 29/11/2004, 11h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo