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?
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".
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!
Vous devez définir un fuseau horaire dans votre DateFormat, sinon il utilisera celui par défaut (selon les paramètres de l'ordinateur).
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
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
2010-04-29T07:30:14Z
(la classe moderne Instant
analyse et formate ces chaînes est, sans formateur explicite).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.DateFormat
, sa méthode parse
renvoie un Date
, vous n’avez donc pas besoin de la conversion dans Date lNextDate = (Date)lFormatter.parse(lNextDate);
.Oui, Java.time fonctionne bien sur les appareils Android anciens et récents. Cela nécessite juste au moins Java 6.
org.threeten.bp
avec des sous-packages.Java.time
.Java.time
a été décrit pour la première fois.Java.time
vers Java 6 et 7 (ThreeTen pour JSR-310).