web-dev-qa-db-fra.com

Convertir une chaîne en Java.util.Date

Je stocke les dates dans une base de données SQLite dans ce format:

d-MMM-yyyy,HH:mm:ss aaa

Lorsque je récupère la date avec ce format, tout va bien, sauf l'heure. L'heure est toujours 00. Voici ma sortie:

String date--->29-Apr-2010,13:00:14 PM
After convrting Date--->1272479414000--Thu Apr 29 00:00:14 GMT+05:30 2010

Voici le code:

    Date lScheduledDate = CalendarObj.getTime();
    DateFormat formatter = new SimpleDateFormat("d-MMM-yyyy,HH:mm:ss aaa");
    SomeClassObj.setTime(formatter.format(lScheduledDate));

    String lNextDate = SomeClassObj.getTime();
    DateFormat lFormatter = new SimpleDateFormat("d-MMM-yyyy,HH:mm:ss aaa");
    Date lNextDate = (Date)lFormatter.parse(lNextDate);
    System.out.println("output here"+lNextDate);

Qu'est-ce que je fais mal?

28

Je pense que votre format de date n'a pas de sens. Il n'y a pas 13h00. Supprimez le "aaa" à la fin de votre format ou transformez le HH en hh.

Néanmoins, cela fonctionne bien pour moi:

String testDate = "29-Apr-2010,13:00:14 PM";
DateFormat formatter = new SimpleDateFormat("d-MMM-yyyy,HH:mm:ss aaa");
Date date = formatter.parse(testDate);
System.out.println(date);

Il imprime "jeu 29 avril 13:00:14 CEST 2010".

54
Thomas Lötzer

Il semble que vous souhaitiez utiliser quelque chose comme SimpleDateFormat . http://Java.Sun.com/j2se/1.4.2/docs/api/Java/text/SimpleDateFormat.html

Vous déclarez votre format de date, puis appelez la méthode d'analyse avec votre chaîne.

private static final DateFormat DF = new SimpleDateFormat(...);
Date myDate = DF.parse("1234");

Et comme dit Guillaume, réglez le fuseau horaire!

4
azp74

Vous devez définir un fuseau horaire dans votre DateFormat, sinon il utilisera celui par défaut (selon les paramètres de l'ordinateur).

2
Guillaume

Java.time

Alors qu'en 2010, Java.util.Date était la classe que nous utilisions tous (avec DateFormat et Calendar), ces classes étaient toujours mal conçues et sont maintenant obsolètes. Aujourd'hui, on utilise Java.time, l'API Java moderne pour la date et l'heure.

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d-MMM-yyyy,HH:mm:ss");

        String dateTimeStringFromSqlite = "29-Apr-2010,13:00:14";
        LocalDateTime dateTime = LocalDateTime.parse(dateTimeStringFromSqlite, formatter);
        System.out.println("output here: " + dateTime);

La sortie est:

sortie ici: 2010-04-29T13: 00: 14

Qu'est-ce qui n'allait pas dans votre code?

La combinaison des majuscules HH et aaa dans vos chaînes de modèle de format n'a pas beaucoup de sens car HH correspond à l'heure du jour, rendant le marqueur AM/PM de aaa superflu. Cela ne devrait toutefois pas faire de mal et je n’ai pas pu reproduire les résultats exacts que vous avez rapportés. Dans tous les cas, votre commentaire va droit au but, peu importe si l’on utilise l’ancien SimpleDateFormat ou le moderne DateTimeFormatter:

'aaa' ne doit pas être utilisé; si vous utilisez 'aaa', spécifiez 'hh'

hh en minuscule est une heure comprise entre 01h00 et 12h00, un marqueur AM/PM est donc nécessaire.

Autres astuces

  • Dans votre base de données, sachant que SQLite n’a pas de type date/heure intégré, utilisez le format standard ISO 8601 et stockez l’heure au format UTC, par exemple 2010-04-29T07:30:14Z (la classe moderne Instant analyse et formate ces chaînes est, sans formateur explicite).
  • N'utilisez pas de décalage tel que GMT+05:30 pour le fuseau horaire. Préférez un fuseau horaire réel, par exemple Asie/Colombo, Asie/Kolkata ou Amérique/New York.
  • Si vous souhaitez utiliser la version obsolète DateFormat, sa méthode parse renvoie un Date, vous n’avez donc pas besoin de la conversion dans Date lNextDate = (Date)lFormatter.parse(lNextDate);.

Question: Puis-je utiliser Java.time sur Android?

Oui, Java.time fonctionne bien sur les appareils Android anciens et récents. Cela nécessite juste au moins Java 6.

  • Dans Java 8 et versions ultérieures et sur les appareils Android récents (à partir de l'API de niveau 26), l'API moderne est intégrée.
  • En Java 6 et 7, obtenez ThreeTen Backport, le backport des classes modernes (ThreeTen pour JSR 310; voir les liens en bas).
  • Sous Android (plus ancien), utilisez l’édition Android de ThreeTen Backport. Il s’appelle ThreeTenABP. Et assurez-vous d'importer les classes de date et d'heure à partir de org.threeten.bp avec des sous-packages.

Liens

0
Ole V.V.