HOWTO · Java
Converti stringa in timestamp in Java
Mostra quattro metodi per convertire una stringa in timestamp in Java
In questa pagina
Un java.sql.Timestamp rappresenta una data e un’ora con precisione fino alle frazioni di secondo ed è spesso usato con JDBC. Scegli il parser in base al formato dell’input: usa Timestamp.valueOf() per una data e ora in formato SQL, DateTimeFormatter per un formato personalizzato oppure LocalDate quando l’input contiene solo una data. Queste conversioni non ricavano un fuso orario che l’input non specifica.
Usa Timestamp.valueOf() per una stringa data e ora standard
Per una stringa come 2024-06-15 14:30:00, Timestamp.valueOf(String) analizza direttamente il formato SQL per timestamp. L’API accetta un valore nel formato di escape JDBC per timestamp, comprese le frazioni di secondo facoltative; non è limitata al formato mostrato qui, che arriva solo ai secondi. Se l’input usa un ordine o separatori diversi, scegli un altro parser.
Esegui questo esempio:
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
La parte .0 stampata rappresenta la frazione di secondo. L’API rifiuta i valori malformati: convalida gli input esterni e gestisci gli errori di parsing al confine della tua applicazione.
Analizza una stringa data e ora personalizzata con DateTimeFormatter
Se il valore segue un formato come 15/06/2024 14:30:00, analizzalo con DateTimeFormatter per ottenere un LocalDateTime, quindi passa quell’oggetto a Timestamp.valueOf(LocalDateTime). Il formato deve corrispondere all’input: dd/MM/uuuu indica giorno, mese e anno, mentre HH:mm:ss usa il formato a 24 ore. Per scelta, LocalDateTime non contiene né un offset né un fuso orario: questo percorso conserva i campi dell’ora locale, ma non identifica un istante univoco.
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);
}
}
Converti una data analizzata in Timestamp con SimpleDateFormat
Nel codice legacy basato su java.util.Date, SimpleDateFormat può analizzare un formato personalizzato. Il parsing produce un Date; getTime() ne restituisce il valore in millisecondi dall’epoca, accettato dal costruttore di Timestamp. Per impostazione predefinita, SimpleDateFormat usa il fuso orario predefinito della JVM e consente date non valide in modo permissivo. Imposta esplicitamente entrambi i comportamenti quando ti serve un’interpretazione prevedibile. L’esempio imposta UTC e disabilita il parsing permissivo. Inoltre, l’API è mutabile e non è thread-safe: non condividere la stessa istanza tra operazioni concorrenti.
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());
}
}
Converti una stringa con la sola data in Timestamp con LocalDate.atStartOfDay()
Un valore che contiene solo una data non specifica un’ora. Analizzalo come LocalDate, scegli la mezzanotte come ora desiderata con atStartOfDay() e converti il LocalDateTime risultante in Timestamp. In questo modo l’assunzione è esplicita; la conversione non conserva un’ora che l’input non conteneva.
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);
}
}
Scegli tra LocalDateTime e Timestamp
Usa LocalDateTime quando il valore rappresenta una data e un’ora del calendario locale e la tua applicazione non deve ancora assegnargli un fuso orario. Usa Timestamp quando un’API come JDBC richiede java.sql.Timestamp: può contenere frazioni di secondo e rappresenta un punto sulla linea temporale tramite il suo valore in millisecondi. La conversione da LocalDateTime usa il fuso orario predefinito della JVM per ricavare quel valore; di conseguenza, gli stessi campi locali possono corrispondere a istanti diversi su macchine con impostazioni predefinite diverse.
Se l’input specifica un offset o una regione, analizzalo e conserva queste informazioni con un tipo java.time che supporta offset o fuso orario, prima di convertirlo in un istante o in un tipo per il database. Né Timestamp.valueOf() né LocalDateTime possono dedurre il fuso orario inteso dal mittente. Anche i tipi di colonna del database e i driver JDBC possono applicare proprie regole sui fusi orari: mantieni coerenti le ipotesi dell’applicazione per la memorizzazione e il recupero dei dati.