SimpleDateFormat n'est pas l'analyse de la millisecondes correctement
De fond:
Dans ma table de base de données, j'ai deux horodateurs
timeStamp1 = 2011-08-23 14:57:26.662
timeStamp2 = 2011-08-23 14:57:26.9
Quand je fais un "ORDER BY TIMESTAMP ASC", timeStamp2 est considéré comme le plus grand timestamp(qui est correcte).
Exigence: j'ai besoin d'obtenir la différence de ces horodateurs (timeStamp2 - timeStamp1)
Ma mise en œuvre:
public static String timeDifference(String now, String prev) {
try {
final Date currentParsed = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(now);
final Date previousParsed = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(prev);
long difference = currentParsed.getTime() - previousParsed.getTime();
return "" + difference;
} catch (ParseException e) {
return "Unknown";
}
}
La réponse doit avoir été 238ms, mais la valeur qui est renvoyée est -653ms.
Je ne suis pas sûr de ce que je fais mal. Des suggestions?
The answer should have been 232ms
, vraiment - je obtenir 900-662 = 238.Si elles sont stockées des timestamps dans la base de données, pourquoi ne vous obtenez des Chaînes de caractères pour les transformer en Dates? Tout simplement en tant que Timestamp cas, et vous aurez deux comparables dates, sans un besoin d'analyser n'importe quelle chaîne. Voir download.oracle.com/javase/6/docs/api/java/sql/...
Thomas - Ouais, désolé, c'est une faute de frappe. Il est 238ms
OriginalL'auteur dkulkarni | 2011-08-23
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas entièrement sûr, mais la JavaDoc membres de cette:
Cela indique que les millisecondes de
2011-08-23 14:57:26.9
serait analysée comme9
au lieu de900
. Ajouter les zéros de fin peut fonctionner:2011-08-23 14:57:26.900
.En interne,
NumberFormat.parse("9")
est appelé, donc il n'y a aucun moyen autre que d'ajouter des zéros à droite.la bonne solution serait de faire comme déjà dit: ne pas gérer les horodatages comme une Chaîne de caractères. Lire et de les gérer comme java.sql.Timestamp, finalement, la conversion de java.util.Date!
Je pense que je vais aller avec l'ajout de zéros pour l'instant. Merci Thomas
la valeur n'a d'importance, mais "26.9" pour être analysée comme 26.009 est déjà dans l'erreur, car il n'est pas le résultat attendu.
OriginalL'auteur Thomas
Le format d'analyse et utilise le format ne correspond pas. Vous vous attendez à un nombre à trois chiffres de terrain et sont seulement en fournissant un chiffres. Il faut
9
et suppose que vous voulez dire009
quand ce que vous voulez, c'est900
. Les formats de Date sont compliquées et quand vous le prouver les dates dans un format différent, il peut analyser différemment de vous.La documentation dit
S
signifie que le nombre de milli-secondes et le nombre dans ce domaine est de 9, de sorte qu'il se comporte correctement.EDIT: Cet exemple peut aider
imprime
Vous avez à donner à la chaîne de date dans le format attendu. Si vous avez modifié l'ordre du jour, du mois ou de l'année, vous attendez pas à juste "savoir" ce que tu veux dire. En ajoutant des zéros est susceptible d'être la solution la plus simple.
Je pense que le problème arrive quand je suis entrer les données dans la base de données. La valeur qui est en cours dans la DB est en fait 2011-08-23 14:57:26.900. Je suis à l'aide d'un H2 db et c'est enlever les zéros de fin. Donc, quand je fais une extraction à partir de la db, je reçois 2011-08-23 14:57:26.9
Pouvez-vous extraire de la date de la DB que l'Horodatage via JDBC au lieu d'utiliser une Chaîne de caractères? Cela permettrait d'éviter le besoin de les convertir/parse de la date/de l'heure.
Ne vous mettez un
Date
et chercher unString
? Si non, vous pourriez avoir de la base de données de la colonne du type de données correspondante, c'est à diretimestamp
pourDate
(récupérer unDate
ensuite) ou(var)char
et l'utilisationString
toujours.OriginalL'auteur Peter Lawrey
J'ai eu le même problème avec trop de temps précis à partir de mes fichiers de log avec 6 chiffres millisecondes. Analyse de l'Époque, a donné jusqu'à 16 minutes de différence! WTF?
Changer le nombre de chiffres de réduction de l'erreur de la différence et de la grâce à ce fil, j'ai pu identifier le problème:
Comme
SimpleDateFormat
en interne ne gère que 3 chiffres, j'ai enlevé l'inutile avec une petite regex (en ignorant les erreurs d'arrondi, de travail pour 1 jusqu'à n chiffres):Grâce à @Pierre Lawrey pour votre réponse, m'a empêché d'aller fou 🙂
OriginalL'auteur arnep
Je suggérerais à l'aide de Joda-Time. Il gère ces situations correctement. Dans l'exemple suivant, les millisecondes sont correctement analysés comme 200ms.
OriginalL'auteur Richard Povinelli