Vous avez une chaîne avec ce format: AAAA-MM-JJ-HH.MM.SS.NNNNNN. L'horodatage provient d'une base de données DB2. Je dois l’analyser dans un fichier Java.sql.Timestamp sans perdre de précision. Jusqu'à présent, je n'ai pas pu trouver le code existant à analyser aussi loin qu'en microsecondes. SimpleDateFormat renvoie une date et analyse uniquement en millisecondes. Joda Time regarda brièvement et ne vit pas que cela fonctionnerait non plus.
Avez-vous essayé d'utiliser Timestamp.valueOf(String)
? Il semble qu'il faille presque exactement ce que vous voulez - il vous suffit de changer le séparateur entre votre date et l'heure en un espace, et ceux entre heures et minutes et minutes et heures aux colons:
import Java.sql.*;
public class Test {
public static void main(String[] args) {
String text = "2011-10-02 18:48:05.123456";
Timestamp ts = Timestamp.valueOf(text);
System.out.println(ts.getNanos());
}
}
En supposant que vous ayez déjà validé la longueur de la chaîne, cela convertira au bon format:
static String convertSeparators(String input) {
char[] chars = input.toCharArray();
chars[10] = ' ';
chars[13] = ':';
chars[16] = ':';
return new String(chars);
}
Vous pouvez également analyser des millisecondes en prenant une sous-chaîne et en utilisant Joda Time ou SimpleDateFormat
(je préfère nettement Joda Time, mais votre kilométrage peut varier). Ensuite, prenez le reste de la chaîne comme une autre chaîne et analysez-le avec Integer.parseInt
. Vous pouvez ensuite combiner les valeurs assez facilement:
Date date = parseDateFromFirstPart();
int micros = parseJustLastThreeDigits();
Timestamp ts = new Timestamp(date.getTime());
ts.setNanos(ts.getNanos() + micros * 1000);
Vous pouvez utiliser Timestamp.valueOf(String)
. La documentation indique qu'elle comprend les horodatages au format yyyy-mm-dd hh:mm:ss[.f...]
, vous devrez peut-être modifier les séparateurs de champ dans votre chaîne entrante.
Là encore, si vous voulez le faire, vous pouvez simplement l’analyser vous-même et utiliser la méthode setNanos
pour stocker les microsecondes.
Voici le moyen prévu pour convertir une chaîne en une date:
String timestamp = "2011-10-02-18.48.05.123";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd-kk.mm.ss.SSS");
Date parsedDate = df.parse(timestamp);
Certes, sa résolution ne dépasse pas la milliseconde, mais dans tous les services plus lents que Twitter, c'est tout ce dont vous avez besoin, d'autant plus que la plupart des machines ne détectent même pas les nanosecondes.
Je crois que vous devez faire ceci:
Option 2 Convertissez au format de date indiqué dans la réponse de Jon Skeet et utilisez-le.
Si vous obtenez du temps sous forme de chaîne au format tel que 1441963946053, vous pouvez simplement faire quelque chose comme suit:
//String timestamp;
Long miliseconds = Long.valueOf(timestamp);
Timestamp ti = new Timestamp(miliseconds);