web-dev-qa-db-fra.com

Java: Convertir une chaîne en TimeStamp

J'ai un problème pendant que j'essaye de convertir une chaîne en un TimeStamp. J'ai un tableau qui a la date dans le format de yyyy-MM-dd et je veux changer dans le format de yyyy-MM-dd HH:mm:ss.SSS. Donc, j'utilise ce code: 

final String OLD_FORMAT = "yyyy-MM-dd";
final String NEW_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
String oldDateString = createdArray[k];
String newDateString;

DateFormat formatter = new SimpleDateFormat(OLD_FORMAT);
Date d = formatter.parse(oldDateString);
((SimpleDateFormat) formatter).applyPattern(NEW_FORMAT);
newDateString = formatter.format(d);
System.out.println(newDateString);

Timestamp ts = Timestamp.valueOf(newDateString);
System.out.println(ts);

et j'obtiens le résultat suivant.

2009-10-20 00: 00: 00.000 

2009-10-20 00: 00: 00.0

mais quand j'essaie de faire simplement 

String text = "2011-10-02 18:48:05.123";
ts = Timestamp.valueOf(text);
System.out.println(ts);

J'obtiens le bon résultat: 

2011-10-02 18: 48: 05.123

Savez-vous ce que je pourrais faire de mal? Merci pour l'aide.

46
Dimitra Micha

Suivez ces étapes pour un résultat correct:

try {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
    Date parsedDate = dateFormat.parse(yourString);
    Timestamp timestamp = new Java.sql.Timestamp(parsedDate.getTime());
} catch(Exception e) { //this generic but you can control another types of exception
    // look the Origin of excption 
}

Veuillez noter que .parse(String) peut émettre un ParseException .

80
ZaoTaoBao
import Java.sql.Timestamp;
import Java.text.DateFormat;
import Java.text.ParseException;
import Java.text.SimpleDateFormat;
import Java.util.Date;

public class Util{
  public static Timestamp convertStringToTimestamp(String str_date) {
    try {
      DateFormat formatter;
      formatter = new SimpleDateFormat("dd/MM/yyyy");
       // you can change format of date
      Date date = formatter.parse(str_date);
      Java.sql.Timestamp timeStampDate = new Timestamp(date.getTime());

      return timeStampDate;
    } catch (ParseException e) {
      System.out.println("Exception :" + e);
      return null;
    }
  }
}
9
Harsh

Je voudrais apporter la réponse moderne. Lorsque cette question a été posée en 2013, il était correct d'utiliser la classe Timestamp, par exemple pour stocker une date-heure dans votre base de données. Aujourd'hui, la classe est dépassée depuis longtemps. L'API Java de date et heure modernes est née avec Java 8 au printemps 2014, il y a trois ans et demi. Je vous recommande de l'utiliser à la place.

Selon votre situation et vos besoins, il existe deux substituts naturels à Timestamp:

  • Instant est un point sur la ligne de temps. Pour la plupart des cas, je considérerais qu'il est le plus sûr de l'utiliser. Une Instant est indépendante du fuseau horaire et fonctionnera généralement bien même dans les cas où votre machine cliente et votre serveur de base de données exécutent des fuseaux horaires différents.
  • LocalDateTime est une date et une heure sans fuseau horaire, comme 2011-10-02 18: 48: 05.123 (pour citer la question).

Un pilote JDBC moderne (JDBC version 4.2 ou supérieure) et d'autres outils modernes d'accès à une base de données seront heureux de stocker une variable Instant ou une variable LocalDateTime dans la colonne de base de données de type timestamp. Les deux classes et les autres classes date-heure que j'utilise dans cette réponse appartiennent à l'API moderne connue sous le nom de Java.time ou JSR-310.

Il est plus facile de convertir votre chaîne en LocalDateTime. Commençons donc par ceci:

    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS");
    String text = "2011-10-02 18:48:05.123";
    LocalDateTime dateTime = LocalDateTime.parse(text, formatter);
    System.out.println(dateTime);

Cette imprime

2011-10-02T18:48:05.123

Si votre chaîne était au format aaaa-MM-jj, faites plutôt:

    String text = "2009-10-20";
    LocalDateTime dateTime = LocalDate.parse(text).atStartOfDay();
    System.out.println(dateTime);

Cette imprime

2009-10-20T00:00

Ou mieux encore, prenez le résultat de LocalDate.parse() et stockez-le dans une colonne de base de données de type date.

Dans les deux cas, la procédure de conversion d'une LocalDateTime en une Instant est la suivante:

    Instant ts = dateTime.atZone(ZoneId.systemDefault()).toInstant();
    System.out.println(ts);

J’ai spécifié une conversion en utilisant le fuseau horaire par défaut de la machine virtuelle, car c’est ce que la classe obsolète aurait utilisée. Ceci est toutefois fragile, car le réglage du fuseau horaire peut être modifié sous nos pieds par d’autres parties de votre programme ou par d’autres programmes exécutés sur la même machine virtuelle. Si vous le pouvez, spécifiez un fuseau horaire au format région/ville à la place, par exemple:

    Instant ts = dateTime.atZone(ZoneId.of("Europe/Athens")).toInstant();
7
Ole V.V.
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

Date date = formatter.parse(dateString);

Timestamp timestamp = new Timestamp(date.getTime());

System.out.println(timestamp);
2
Akshay Misal

convertissez d'abord votre chaîne de date en date puis convertissez-la en timestamp en utilisant le jeu de lignes suivant

Date date=new Date();
Timestamp timestamp = new Timestamp(date.getTime());//instead of date put your converted date
Timestamp myTimeStamp= timestamp;
2
KhAn SaAb
DateFormat formatter;
formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = (Date) formatter.parse(str_date);
Java.sql.Timestamp timeStampDate = new Timestamp(date.getTime());
2
Mahesh Narwade

Je suis sûr que la solution est que oldDateString ressemble à "2009-10-20". Évidemment, cela ne contient aucune donnée temporelle inférieure à jours. Si vous formatez cette chaîne avec votre nouveau formateur, où doit-il extraire les minutes, les secondes et les millisecondes?

Le résultat est donc tout à fait correct: 2009-10-20 00: 00: 00.000

Ce qu'il vous faut pour résoudre ce problème, c'est l'horodatage d'origine (y compris les données temporelles) avant votre premier formatage.

1
solver

Le moyen le plus simple pour convertir String en Java.sql.Timestamp:

Timestamp t = new Timestamp(DateUtil.provideDateFormat().parse("2019-01-14T12:00:00.000Z").getTime());
0
Yuliia Ashomok

pouvez-vous l'essayer une fois ...

String dob="your date String";
String dobis=null;
final DateFormat df = new SimpleDateFormat("yyyy-MMM-dd");
final Calendar c = Calendar.getInstance();
try {
    if(dob!=null && !dob.isEmpty() && dob != "")
    {
    c.setTime(df.parse(dob));
    int month=c.get(Calendar.MONTH);
    month=month+1;
    dobis=c.get(Calendar.YEAR)+"-"+month+"-"+c.get(Calendar.DAY_OF_MONTH);
    }

}
0
Suresh U