J'utilise java.text.SimpleDateFormat
pour analyser des représentations de chaînes de valeurs de date/heure dans un document XML. Je vois tous les temps qui ont une valeur de 12 heures décalée de 12 heures dans le futur, je. e. 20 heures passées passées à midi signifient 20 minutes après minuit le jour suivant.Pourquoi 12h20 analyser à 0:20 le jour suivant?
J'ai écrit un test unitaire qui semble confirmer que l'erreur est faite lors de l'analyse (j'ai vérifié les valeurs de retour de getTime()
avec la commande shell linux date
). Maintenant, je me demande:
- Y at-il un bogue dans la méthode
parse()
? - Y at-il un problème avec la chaîne d'entrée?
- Est-ce que j'utilise la mauvaise chaîne de format pour l'entrée?
Les données d'entrée proviennent du service Yahoo de YWeather. Voici le test et sa sortie:
public class YWeatherReaderTest
{
public static final String[] rgDateSamples = {
"Thu, 08 Apr 2010 12:20 PM CEST",
"Thu, 08 Apr 2010 12:20 AM CEST"
};
public void dateParsing() throws ParseException
{
DateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy K:m a z",
Locale.US);
for (String dtsSrc : YWeatherReaderTest.rgDateSamples) {
Date dt = formatter.parse(dtsSrc);
String dtsDst = formatter.format(dt);
System.out.println(dtsSrc);
System.out.println(dtsDst);
System.out.println();
}
}
}
Thu, 08 Apr 2010 12:20 PM CEST Fri, 09 Apr 2010 0:20 AM CEST Thu, 08 Apr 2010 12:20 AM CEST Thu, 08 Apr 2010 0:20 PM CEST
La deuxième ligne de sortie de la deuxième itération est un peu bizarre, parce que 00h20 est pas PM. La valeur en millisecondes de l'objet Date
correspond cependant au (mauvais) temps de 20 minutes après midi.
Ceci est un autre bel exemple de « SELECT ISN » t cassé ". Même si je n'ai jamais rencontré de bogue dans une bibliothèque standard mature et largement utilisée, j'accuse parfois la bibliothèque si je ne trouve pas le problème. Et jusqu'à présent, j'ai toujours eu tort. –