Java, heure locale

Résolu
sebastien61 Messages postés 495 Date d'inscription   Statut Membre Dernière intervention   -  
sebastien61 Messages postés 495 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je souhaite écrire la date "30/03/2008 02:00:00" (que je récupère sous forme de String) dans une base de données. Cette date se trouve avant un passage heure d'hiver vers heure d'été (changement à 3h du matin)

Quand je fait :
String strDate = "30/03/2008 02:00:00";
SimpleDateFormatter sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Date maDate = sdf.parse(strDate);

J'ai en sortie dans maDate : 30/03/2008 03:00:00 !

Remarques : si je fais le même traitement avec une heure d'été, je n'ai pas de problème. J'ai essayé en ajouter "GMT+1:00", "GMT", "GMT-1:00" dans le String, mais ça n'a pas résolu mon problème...

Je comprends que c'est un problème de changement d'heure, mais j'aimerais que java prenne la date/l'heure comme étant locale, sans la modifier !

Merci d'avance pour votre aide.

3 réponses

  1. danimo
     
    Salut,
    Finalement j'ai trouvé ceci:

        import java.text.*;
       import java.util.*;
     
        public class TestDateTimeZone
       {
          public static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
       
           public static void main(String[] args) throws Exception
          {  
             String laDateBdd = "30/03/2008 02:00:00";
             System.out.println("\nLa date Bdd :\n" + "\"" + laDateBdd + "\"\n");
             
             String laDate = laDateBdd.substring(6,10) + "/" + laDateBdd.substring(3,5)
                + "/" + laDateBdd.substring(0,2) + " " + laDateBdd.substring(11);
             System.out.println("La date qui sera utilisee :\n" + laDate + "\n");
          
          // Pour éviter les fuseaux horaires
          // Sinon le parsing est impossible TOUTE LA JOURNEE D'UN CHANGEMENT D'HEURE
             TimeZone utc = TimeZone.getTimeZone("UTC");
             TimeZone.setDefault(utc);
             DATE_FORMATTER.setTimeZone(utc);
          
          
          // parsing de la date
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
             Date parsedDate = sdf.parse(laDate);
          
          // formattage selon définition du projet
             String formattedDateString = DATE_FORMATTER.format(parsedDate);
          
             System.out.println("Avec la date BDD: " + laDateBdd);
             System.out.println("Nous utilisons  : " + laDate);
             System.out.println("Et nous obtenons: " + formattedDateString);
          }
       }
    
    3
    1. sebastien61 Messages postés 495 Date d'inscription   Statut Membre Dernière intervention   59
       
      Merci, je n'ai pas testé ton programme. En fait j'ai trouvé un morceau de code ici : https://www.roseindia.net/java/java-conversion/DateToGMT.shtml
      Ensuite j'ai rajouté l'argument en lancement de l'appli : -Duser.timezone=GMT pour indiquer à la JVM qu'on est au méridien de greenwich.

      C'est pas très joli mais ça fonctionne (parce qu'il n'y a pas de changement d'heure au méridien greenwich !

      Merci quand même pour ton aide.
      0
  2. danimo
     
    Salut,

    Une solution:

    String laDateBdd = "30/03/2008 02:00:00";
             System.out.println("\nLa date Bdd :\n" + "\"" + laDateBdd + "\"\n");
             
             String laDate = laDateBdd.substring(6,10) + "/" + laDateBdd.substring(3,5) + "/"
                + laDateBdd.substring(0,2) + " " + laDateBdd.substring(11);
             System.out.println("La date qui sera utilisee :\n" + laDate + "\n");
             
             try {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
                Date d = sdf.parse(laDate);
                System.out.println("La date obtenue:\n" + d.toString() + "\n");
    
                sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    
                String maDate = sdf.format(d);
                System.out.println("La date que l'on veut:\n" + maDate + "\n");
             } 
                 catch(Exception e) {
                   System.err.println("Exception :");
                   e.printStackTrace();
                }


    Cordialement,

    Dan
    0
    1. sebastien61 Messages postés 495 Date d'inscription   Statut Membre Dernière intervention   59
       
      Salut danimo, merci pour ta réponse.

      J'ai essayé avec "30/03/2008 02:20:00", voici l'affichage :
      La date Bdd :
      "30/03/2008 02:20:00"
      
      La date qui sera utilisee :
      2008/03/30 02:20:00
      
      La date obtenue:
      Sun Mar 30 03:20:00 CEST 2008
      
      La date que l'on veut:
      30/03/2008 03:20:00
      


      Ce n'est pas un problème avec SimpleDateFormat, mais un problème de timezone (dû au décalage horaire).
      Merci pour ton aide malgré tout !
      D'autres suggestions ?

      Merci d'avance
      0
  3. danimo
     
    Salut,

    Peux-tu me dire ce que tu obtiens avec ceci (qui ne changera pas le résultat, mais j'ai besoin de ce qui s'affiche dans la boîte de dialogue)

    String info = "langue/pays = "
                + System.getProperty("user.language") + "/"
                + System.getProperty("user.country") + "\n";
             javax.swing.JOptionPane.showMessageDialog(null,info);

    merci
    0
    1. sebastien61 Messages postés 495 Date d'inscription   Statut Membre Dernière intervention   59
       
      J'obtiens une fenêtre dans laquelle il y a écrit : "langue/pays = fr/FR".
      Merci pour ton aide
      0