HOWTO · Java

Convertir une chaîne de caractères en Timestamp en Java

Il montre quatre méthodes pour convertir une chaîne en horodatage en Java

Sur cette page

Un java.sql.Timestamp représente une date et une heure avec une précision à la fraction de seconde ; il est souvent utilisé avec JDBC. Choisissez le parseur selon la forme de votre entrée : utilisez Timestamp.valueOf() pour une date-heure au format SQL, DateTimeFormatter pour un format personnalisé ou LocalDate si l’entrée ne contient qu’une date. Ces conversions ne peuvent pas déterminer un fuseau horaire absent de l’entrée.

Utiliser Timestamp.valueOf() pour une chaîne date-heure au format standard

Pour une chaîne telle que 2024-06-15 14:30:00, Timestamp.valueOf(String) analyse directement le format SQL d’un timestamp. L’API accepte une valeur au format d’échappement JDBC pour les timestamps, avec des fractions de seconde facultatives ; elle ne se limite donc pas à la forme illustrée ici, qui s’arrête aux secondes. Si votre entrée utilise un autre ordre ou d’autres séparateurs, choisissez un autre parseur.

Exécutez cet exemple :

import java.sql.Timestamp;

public class StringToTimestamp {
  public static void main(String[] args) {
    String input = "2024-06-15 14:30:00";
    Timestamp timestamp = Timestamp.valueOf(input);
    System.out.println(timestamp);
  }
}
2024-06-15 14:30:00.0

Le .0 affiché correspond à la partie fractionnaire de la seconde. L’API rejette une valeur mal formée ; validez les entrées externes et gérez les erreurs d’analyse à la frontière de votre application.

Analyser une chaîne date-heure personnalisée avec DateTimeFormatter

Lorsqu’une valeur suit un motif tel que 15/06/2024 14:30:00, analysez-la avec DateTimeFormatter pour obtenir un LocalDateTime, puis transmettez cet objet à Timestamp.valueOf(LocalDateTime). Le motif doit correspondre à l’entrée : dd/MM/uuuu indique le jour, le mois et l’année, tandis que HH:mm:ss utilise une horloge sur 24 heures. LocalDateTime ne contient volontairement ni décalage ni fuseau horaire ; cette méthode conserve donc les champs de l’heure locale sans identifier un instant unique.

import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class CustomTimestamp {
  public static void main(String[] args) {
    String input = "15/06/2024 14:30:00";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm:ss");
    LocalDateTime localDateTime = LocalDateTime.parse(input, formatter);
    Timestamp timestamp = Timestamp.valueOf(localDateTime);
  }
}

Convertir une date analysée en Timestamp avec SimpleDateFormat

Pour le code ancien fondé sur java.util.Date, SimpleDateFormat peut analyser un motif personnalisé. L’analyse produit un Date ; getTime() renvoie sa valeur en millisecondes depuis l’époque, que le constructeur de Timestamp accepte. Par défaut, SimpleDateFormat utilise le fuseau horaire par défaut de la JVM et son analyse est permissive. Définissez explicitement ces deux paramètres lorsque vous avez besoin d’une interprétation prévisible. L’exemple fixe le fuseau à UTC et désactive l’analyse permissive. Cette API est également mutable et n’est pas thread-safe : ne partagez pas une même instance entre plusieurs threads utilisés simultanément.

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class LegacyTimestamp {
  public static void main(String[] args) throws ParseException {
    SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
    formatter.setLenient(false);
    Date parsed = formatter.parse("15/06/2024 14:30:00");
    Timestamp timestamp = new Timestamp(parsed.getTime());
  }
}

Convertir une chaîne contenant uniquement une date en Timestamp avec LocalDate.atStartOfDay()

Une valeur qui ne contient qu’une date ne précise aucune heure. Analysez-la avec LocalDate, choisissez minuit comme heure voulue à l’aide de atStartOfDay(), puis convertissez le LocalDateTime obtenu en Timestamp. Cette démarche rend l’hypothèse explicite ; elle ne préserve pas une heure qui ne figurait pas dans l’entrée.

import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;

public class DateOnlyTimestamp {
  public static void main(String[] args) {
    LocalDate date = LocalDate.parse("2024-06-15");
    LocalDateTime startOfDay = date.atStartOfDay();
    Timestamp timestamp = Timestamp.valueOf(startOfDay);
  }
}

Choisir entre LocalDateTime et Timestamp

Utilisez LocalDateTime lorsque la valeur correspond à une date et une heure locales et que votre application ne doit pas encore lui attribuer de fuseau horaire. Utilisez Timestamp lorsqu’une API, par exemple JDBC, exige un java.sql.Timestamp ; ce type peut contenir des fractions de seconde et représente un point sur la ligne du temps au moyen de sa valeur en millisecondes. La conversion depuis LocalDateTime utilise le fuseau horaire par défaut de la JVM pour calculer cette valeur : les mêmes champs d’heure locale peuvent donc correspondre à des instants différents sur des machines dont les fuseaux par défaut diffèrent.

Si l’entrée indique un décalage ou une région, analysez et conservez cette information avec un type java.time qui prend en charge les décalages ou les fuseaux horaires, avant de convertir la valeur en instant ou en type de base de données. Ni Timestamp.valueOf() ni LocalDateTime ne peuvent déduire le fuseau horaire voulu par l’expéditeur. Les types de colonnes de base de données et les pilotes JDBC peuvent aussi appliquer leurs propres règles de fuseau horaire ; veillez donc à la cohérence des hypothèses de stockage et de lecture de votre application.