web-dev-qa-db-fra.com

SimpleDateFormat produisant une date et une heure incorrectes lors de l'analyse de "AAAA-MM-jj HH: mm"

J'essaie d'analyser un String (YYYY-MM-dd HH:mm) à Date, mais en obtenant une date erronée par rapport à celle attendue.

CODE:

Date newDate = null;
String dateTime = "2013-03-18 08:30";
SimpleDateFormat df = new SimpleDateFormat("YYYY-MM-dd HH:mm", Locale.ENGLISH);
df.setLenient(false);
try {
    newDate = df.parse(dateTime);
} catch (ParseException e) {
    throw new InvalidInputException("Invalid date input.");
}

Produit:

Dim 30 déc 08:30:00 EST 2012 (faux)

J'ai essayé de déclencher Lenient mais pas de chance.

Mise à jour

Merci Sudhanshu pour la réponse, cela m'a aidé à résoudre la conversion Java. Lorsque j'entre la date retournée à partir du code ci-dessus dans la base de données, j'obtiens la date correctement mais l'heure est toujours 00:00.

ps.setDate(3, new Java.sql.Date(app.getDate().getTime()));
15
Sas

AAAA devrait être aaaa-

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH);

Veuillez consulter la documentation de SimpleDateFormat ici
Java 6: http://docs.Oracle.com/javase/6/docs/api/Java/text/SimpleDateFormat.html
Java 7: http://docs.Oracle.com/javase/7/docs/api/Java/text/SimpleDateFormat.html

47
Sudhanshu Umalkar

Utilisez un petit boîtier Y, pas des bouchons. c'est-à-dire aaaa pas AAAA

Vérifiez les commentaires ici: Java Simple Date Format et autres réponses référencées ici.

7
Raymond Machira

Il y a deux problèmes.

  1. La chaîne de format doit être "yyyy-MM-dd HH:mm".
  2. Le type de données pour stocker l'heure est TimeStamp et non Date dans la base de données.

Corrigez les deux choses et vous pourrez stocker et récupérer la date avec l'heure.

5
Rais Alam

Voici la réponse moderne. Les autres réponses étaient de bonnes réponses lorsqu'elles ont été écrites en 2013. L'année suivante, l'API de date et d'heure moderne est sortie en remplacement des anciennes classes Date, SimpleDateFormat et amis. À mon humble avis, vous devez utiliser les nouvelles classes maintenant. Ils sont beaucoup plus conviviaux pour les programmeurs.

    LocalDateTime newDate = null;
    String dateTime = "2013-03-18 08:30";
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm", Locale.ENGLISH);
    try {
        newDate = LocalDateTime.parse(dateTime, dtf);
    } catch (DateTimeParseException e) {
        throw new InvalidInputException("Invalid date input.");
    }

À l'exception des noms de classe, ce n'est pas si différent de l'ancien code. Avec d'autres exemples, il y aura des différences, généralement les classes modernes fourniront un code plus clair et moins de possibilités d'erreurs.

Pour une petite démonstration d'une différence, essayons la chaîne de formatage que vous aviez en majuscule YYYY:

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm", Locale.ENGLISH);

Maintenant, le code lance un Java.time.format.DateTimeParseException: Text '2013-03-18 08:30' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {MonthOfYear=3, DayOfMonth=18, WeekBasedYear[WeekFields[SUNDAY,1]]=2013},ISO resolved to 08:30 of type Java.time.format.Parsed. C'est long, je sais. La chose à noter est qu'il n'y a pas d'année parmi les domaines mentionnés, seulement un WeekBasedYear. Ce n'est pas la même chose; et vous avez peut-être compris maintenant que c'est exactement parce que les majuscules Y sont pour l'année basée sur la semaine (uniquement utile avec un numéro de semaine), où vous devez utiliser les minuscules y pour l'année. Je considère ce comportement un peu plus utile que ce que faisaient les anciennes classes: ils vous ont donné un résultat incorrect, ont prétendu que tout allait bien et vous ont laissé complètement dans l'ignorance de ce qui n'allait pas.

Ensuite, je comprends que vous souhaitez stocker votre date-heure dans une base de données. Autrefois, vous convertissiez en un type Java.sql Approprié. Plus nécessaire. Je crois qu'avec un pilote JDBC 4.2, vous pouvez simplement faire:

    ps.setObject(3, newDate);

Je n'ai cependant pas testé cela avec une base de données. Notez que vous utilisez setObject() au lieu de setDate().

2
Ole V.V.