43 votes

Convertir une chaîne de caractères Java en un horodatage sql.

J'ai un String qui arrive avec ce format : YYYY-MM-DD-HH.MM.SS.NNNNNN L'horodatage provient d'une base de données DB2. Je dois l'analyser en un timestamp java.sql.Timestamp sans perdre de précision. Jusqu'à présent, je n'ai pas pu trouver de code existant pour analyser ce type de données jusqu'à la microseconde. SimpleDateFormat renvoie une date et n'analyse qu'en millisecondes. J'ai regardé brièvement JodaTime et je n'ai pas vu que cela pouvait fonctionner non plus.

2 votes

Si l'horodatage provient d'une base de données DB2, pourquoi le lire sous forme de chaîne plutôt que de le lire directement sous forme d'horodatage ?

1 votes

L'horodatage provient de la base de données et un client nous le renvoie pour une lecture avec clé.

1 votes

Si vous utilisez l'horodatage pour une lecture avec clé, et que vous l'envoyez d'abord au client, vous pourriez envisager de le convertir en un nombre de nanosecondes et de le relire ensuite, au lieu d'une valeur de chaîne de caractères. long l = ts.getTime() et le relire ensuite avec new Timestamp(l) . Vous pourriez même sérialiser cette valeur pour gagner de l'espace sur le fil (mais vous perdriez en redondance humaine dans ce cas).

82voto

Jon Skeet Points 692016

Avez-vous essayé d'utiliser Timestamp.valueOf(String) ? Il semble qu'il devrait faire presque Vous devez simplement remplacer le séparateur entre la date et l'heure par un espace, et ceux entre les heures et les minutes, et les minutes et les heures, par des deux points :

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 avez déjà validé la longueur de la chaîne de caractères, la conversion se fera 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 en millisecondes en prenant une sous-chaîne et en utilisant Joda Time ou SimpleDateFormat (Je préfère de loin Joda Time, mais votre avis peut varier). Puis prenez le reste de la chaîne comme une autre chaîne et analysez-la 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);

9voto

Cameron Skinner Points 19987

Vous pourriez utiliser Timestamp.valueOf(String) . La documentation indique qu'il comprend les horodatages au format yyyy-mm-dd hh:mm:ss[.f...] Il se peut donc que vous deviez modifier les séparateurs de champs dans votre chaîne entrante.

Mais si vous faites cela, vous pouvez l'analyser vous-même et utiliser la méthode d'analyse de l'ADN. setNanos pour stocker les microsecondes.

0 votes

Timestamp.valueOf("2015/06/08".replaceAll("/", "-") + " 00:00:00")

8voto

Supuhstar Points 2310

Voici la façon prévue de convertir une chaîne en 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, la résolution n'est que de l'ordre de la milliseconde, mais pour tous les services plus lents que Twitter, c'est tout ce dont vous aurez besoin, d'autant que la plupart des machines n'arrivent même pas à suivre les nanosecondes réelles.

0 votes

Cela vous donne java.util.Date et la demande porte sur la création de java.sql.Timestamp. C'est aussi en Java, là où la question demande du Scala.

0 votes

Vous avez raison sur le premier point, mais la question ne mentionne jamais Scala et est étiquetée Java. En fait, pour autant que je sache, votre commentaire est le seul texte de cette page qui mentionne Scala.

1 votes

Désolé, j'ai confondu avec une autre question qui demandait explicitement Scala. Je retirerai mon vote négatif dès qu'ils me le permettront.

2voto

Admir Sabanovic Points 380

Si vous obtenez l'heure sous forme de chaîne au format 1441963946053, vous pouvez simplement faire quelque chose comme suit :

//String timestamp;
Long miliseconds = Long.valueOf(timestamp);
Timestamp ti = new Timestamp(miliseconds);

0 votes

Mais vous n'obtenez pas la date dans ce format, voir la question.

1voto

DwB Points 14687

Je crois que vous devez le faire :

  1. Convertissez everythingButNano en utilisant SimpleDateFormat ou similaire en everythingDate.
  2. Convertir le nano en utilisant Long.valueof(nano)
  3. Convertir everythingDate en un Timestamp avec new Timestamp(everythingDate.getTime())
  4. Définissez les nanos du Timestamp avec Timestamp.setNano()

Option 2 Convertissez au format de date indiqué dans la réponse de Jon Skeet et utilisez-le.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X