Comment analyser une date? [dupliquer]
-
14-09-2019 - |
Question
Cette question a déjà une réponse ici:
- Java chaîne à ce jour conversion 13 réponses
Je suis en train d'analyser cette date avec SimpleDateFormat
et il ne fonctionne pas:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Formaterclass {
public static void main(String[] args) throws ParseException{
String strDate = "Thu Jun 18 20:56:02 EDT 2009";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date dateStr = formatter.parse(strDate);
String formattedDate = formatter.format(dateStr);
System.out.println("yyyy-MM-dd date is ==>"+formattedDate);
Date date1 = formatter.parse(formattedDate);
formatter = new SimpleDateFormat("dd-MMM-yyyy");
formattedDate = formatter.format(date1);
System.out.println("dd-MMM-yyyy date is ==>"+formattedDate);
}
}
Si je tente ce code avec strDate = "2008-10-14"
, j'ai une réponse positive. Quel est le problème? Comment puis-je analyser ce format?
PS. Je suis arrivé à cette date d'un jDatePicker
et il n'y a pas d'instructions sur la façon de modifier le format de date que je reçois lorsque l'utilisateur choisit une date.
La solution
Vous ne pouvez pas attendre à analyser une date avec un SimpleDateFormat qui est mis en place avec un format différent.
Pour analyser votre "18 Jeu Juin 2009 20:56:02 EDT" chaîne de date dont vous avez besoin d'un SimpleDateFormat comme celui-ci (à peu près):
SimpleDateFormat parser=new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
Utilisez cette option pour analyser la chaîne en une date, puis l'autre SimpleDateFormat pour activer cette date dans le format que vous voulez.
String input = "Thu Jun 18 20:56:02 EDT 2009";
SimpleDateFormat parser = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
Date date = parser.parse(input);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = formatter.format(date);
...
JavaDoc: http://docs.oracle. com / JavaSE / 7 / docs / api / java / text / SimpleDateFormat.html
Autres conseils
Le problème est que vous avez une date formatée comme ceci:
Thu Jun 18 20:56:02 EDT 2009
Mais utilisent un SimpleDateFormat
qui est:
yyyy-MM-dd
Les deux formats ne sont pas d'accord. Vous devez construire un SimpleDateFormat
qui correspond à la mise en page de la chaîne que vous essayez d'analyser en une date. Doublure choses pour le rendre facile à voir, vous voulez un SimpleDateFormat
comme ceci:
EEE MMM dd HH:mm:ss zzz yyyy
Thu Jun 18 20:56:02 EDT 2009
Consultez la page JavaDoc I liés et voir comment les caractères sont utilisés.
Nous avons maintenant une façon plus moderne pour faire ce travail.
java.time
Le cadre java.time est avec Java 8 et versions ultérieures. Voir Tutorial . Ces nouvelles classes sont inspirés par Joda-Time , défini par JSR 310 et prolongée par le ThreeTen-extra projet. Ils sont une grande amélioration par rapport aux anciennes classes ennuyeuses, java.util.Date/.Calendar et al.
Notez que les codes 3-4 lettre comme EDT
ne sont ni standardisés ni unique. Évitez de les autant que possible. Apprenez à utiliser ISO 8601 formats standard à la place. Le cadre de java.time peut prendre un coup de couteau à la traduction, mais la plupart des codes couramment utilisés ont des valeurs en double.
Par ailleurs, notez comment java.time par défaut génère des chaînes en utilisant les formats ISO 8601, mais étendu en ajoutant le nom du fuseau horaire entre parenthèses.
String input = "Thu Jun 18 20:56:02 EDT 2009";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "EEE MMM d HH:mm:ss zzz yyyy" , Locale.ENGLISH );
ZonedDateTime zdt = formatter.parse ( input , ZonedDateTime :: from );
Dump à la console.
System.out.println ( "zdt : " + zdt );
Lorsque l'exécution.
ZDT: 2009-06-18T20: 56: 02-04: 00 [America / New_York]
Régler la zone horaire
Pour le plaisir, nous allons ajuster à la zone de temps en Inde.
ZonedDateTime zdtKolkata = zdt.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) );
zdtKolkata: 2009-06-19T06: 26: 02 + 05: 30 [Asie / Calcutta]
Convertir en j.u.Date
Si vous avez vraiment besoin d'un objet java.util.Date pour une utilisation avec des classes pas encore mis à jour les types de java.time, convertir. Notez que vous perdez la zone de temps imparti, mais qui ont le même temps réglé automatiquement UTC .
java.util.Date date = java.util.Date.from( zdt.toInstant() );
Que diriez-vous getSelectedDate ? Quoi qu'il en soit, en particulier sur votre question de code, le problème est avec cette ligne:
new SimpleDateFormat("yyyy-MM-dd");
La chaîne qui va dans le constructeur doit correspondre au format de la date. La documentation sur la façon de le faire est . On dirait que vous avez besoin de quelque chose proche de "d HH EEE MMM: mm: ss zzz aaaa"
En réponse à: " Comment convertir 13 Mar septembre 2016 00:00:00 GMT-0500 (Hora de verano central (México)) à JJ-MM-yy en Java? ", il a été marqué comment double
Essayez ceci:
Avec java.util.Date
, java.text.SimpleDateFormat
, il est une solution simple.
public static void main(String[] args) throws ParseException {
String fecha = "Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México))";
Date f = new Date(fecha);
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("-5GMT"));
fecha = sdf.format(f);
System.out.println(fecha);
}