100 votes

Java: Convertir une chaîne en TimeStamp

J'ai un problème lorsque j'essaie de convertir une String en TimeStamp. J'ai un tableau qui contient la date au format yyyy-MM-dd et je veux la changer au format 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;

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

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

et je reçois le résultat suivant.

2009-10-20 00:00:00.000

2009-10-20 00:00:00.0

mais quand j'essaie simplement de faire

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

Je reçois le bon résultat :

2011-10-02 18:48:05.123

Sauriez-vous ce que je pourrais faire de travers ?

Merci pour l'aide.

139voto

ZaoTaoBao Points 772

Suivez ces étapes pour obtenir 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) { // c'est générique mais vous pouvez contrôler d'autres types d'exceptions
    // regardez l'origine de l'exception
}

Veuillez noter que .parse(String) pourrait lever une ParseException.

27voto

Hrash Shah Points 31
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 strDate) {
    try {
      DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
       // vous pouvez changer le format de la date
      Date date = formatter.parse(strDate);
      Timestamp timeStampDate = new Timestamp(date.getTime());

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

19voto

Ole V.V. Points 24677

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

En fonction de votre situation et de vos besoins exacts, il existe deux remplacements naturels pour Timestamp:

  • Instant est un point sur la ligne de temps. Pour la plupart des usages, je considérerais que c'est le plus sûr à utiliser. Un Instant est indépendant du fuseau horaire et fonctionnera généralement bien même dans des situations où votre appareil client et votre serveur de base de données sont dans des fuseaux horaires différents.
  • LocalDateTime est une date et une heure de la journée sans fuseau horaire, comme 2011-10-02 18:48:05.123 (pour citer la question).

Un pilote JDBC moderne (JDBC 4.2 ou supérieur) et d'autres outils modernes pour l'accès aux bases de données seront ravis de stocker soit un Instant soit un LocalDateTime dans votre 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 appelée java.time ou JSR-310.

Il est le plus simple de convertir votre chaîne en LocalDateTime, donc commençons par cela :

    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);

Cela affiche

2011-10-02T18:48:05.123

Si votre chaîne était au format yyyy-MM-dd, faites plutôt ceci :

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

Cela affiche

2009-10-20T00:00

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

Dans les deux cas, la procédure de conversion d'un LocalDateTime en un 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 JVM car c'est ce que la classe obsolète aurait utilisé. Cependant, cela est fragile, car le paramétrage du fuseau horaire peut être modifié par d'autres parties de votre programme ou par d'autres programmes s'exécutant dans la même JVM. Si possible, spécifiez un fuseau horaire au format region/ville au lieu de cela, par exemple :

    Instant ts = dateTime.atZone(ZoneId.of("Europe/Athens")).toInstant();

12voto

Iuliia Points 198

La manière simple de convertir une chaîne en java.sql.Timestamp:

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

DateUtil.java:

import java.text.SimpleDateFormat;
import java.util.TimeZone;

public interface DateUtil {

  String ISO_DATE_FORMAT_ZERO_OFFSET = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
  String UTC_TIMEZONE_NAME = "UTC";

  static SimpleDateFormat provideDateFormat() {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(ISO_DATE_FORMAT_ZERO_OFFSET);
    simpleDateFormat.setTimeZone(TimeZone.getTimeZone(UTC_TIMEZONE_NAME));
    return simpleDateFormat;
  }
}

4voto

KeyMaker00 Points 1174

Juste pour des raisons de clarté, voici une solution avec lambda et référence de méthode :

Format ISO ?

Description : La méthode suivante

  • convertit une String avec le modèle yyyy-MM-dd en un Timestamp, si une entrée valide est donnée,
  • retourne un null, si une valeur null est donnée,
  • lance une DateTimeParseException, si une entrée invalide est donnée

Code :

static Timestamp convertStringToTimestamp(String strDate) {
    return Optional.ofNullable(strDate) // wrap the String into an Optional
                   .map(str -> LocalDate.parse(str).atStartOfDay()) // convert into a LocalDate and fix the hour:minute:sec to 00:00:00
                   .map(Timestamp::valueOf) // convert to Timestamp
                   .orElse(null); // if no value is present, return null
}

Validation : Cette méthode peut être testée avec ces tests unitaires : (avec Junit5 et Hamcrest)

@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenValidInput() {
    // given
    String strDate = "2020-01-30";

    // when
    final Timestamp result = convertStringToTimestamp(strDate);

    // then
    final LocalDateTime dateTime = LocalDateTime.ofInstant(result.toInstant(), ZoneId.systemDefault());
    assertThat(dateTime.getYear(), is(2020));
    assertThat(dateTime.getMonthValue(), is(1));
    assertThat(dateTime.getDayOfMonth(), is(30));
}

@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenInvalidInput() {
    // given
    String strDate = "7770-91-30";

    // when, then
    assertThrows(DateTimeParseException.class, () -> convertStringToTimestamp(strDate));
}

@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenNullInput() {
    // when
    final Timestamp result = convertStringToTimestamp(null);

    // then
    assertThat(result, is(nullValue()));
}

Un autre format ?

Généralement, la chaîne à analyser arrive avec un autre format. Une façon de gérer cela est d'utiliser un formateur pour le convertir en un autre format. Voici un exemple :

Entrée : 20200130 11:30

Modèle : yyyyMMdd HH:mm

Sortie : Timestamp de cette entrée

Code :

static Timestamp convertStringToTimestamp(String strDate) {
    final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm");
    return Optional.ofNullable(strDate) //
                   .map(str -> LocalDateTime.parse(str, formatter))
                   .map(Timestamp::valueOf) //
                   .orElse(null);
}

Test :

@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenValidInput() {
    // given
    String strDate = "20200130 11:30";

    // when
    final Timestamp result = convertStringToTimestamp(strDate);

    // then
    final LocalDateTime dateTime = LocalDateTime.ofInstant(result.toInstant(), ZoneId.systemDefault());
    assertThat(dateTime.getYear(), is(2020));
    assertThat(dateTime.getMonthValue(), is(1));
    assertThat(dateTime.getDayOfMonth(), is(30));
    assertThat(dateTime.getHour(), is(11));
    assertThat(dateTime.getMinute(), is(30));
}

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