HOWTO · Java
Convertir cadena a marca de tiempo en Java
Muestra cuatro métodos para convertir una cadena en una marca de tiempo en Java
En esta página
java.sql.Timestamp representa una fecha y hora con precisión de fracciones de segundo y se usa con frecuencia con JDBC. Elige el analizador según la forma de la entrada: usa Timestamp.valueOf() para una fecha y hora con formato SQL, DateTimeFormatter para un formato personalizado o LocalDate cuando la entrada contiene solo una fecha. Estas conversiones no determinan una zona horaria que no esté presente en la entrada.
Usa Timestamp.valueOf() para una cadena estándar de fecha y hora
Para una cadena como 2024-06-15 14:30:00, Timestamp.valueOf(String) analiza directamente el formato de marca de tiempo SQL. La API acepta valores en el formato de escape de marca de tiempo de JDBC, incluidas fracciones de segundo opcionales; no se limita al formato exacto que se muestra aquí, que solo incluye segundos. Si la entrada tiene otro orden o usa otros separadores, emplea un analizador diferente.
Ejecuta este ejemplo:
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
El .0 que se muestra corresponde a la fracción de segundo. La API rechaza los valores mal formados; valida las entradas externas y gestiona los errores de análisis en el límite de la aplicación.
Analiza una cadena personalizada de fecha y hora con DateTimeFormatter
Si el valor sigue un patrón como 15/06/2024 14:30:00, analízalo con DateTimeFormatter para obtener un LocalDateTime y luego pasa ese objeto a Timestamp.valueOf(LocalDateTime). El patrón debe coincidir con la entrada: dd/MM/uuuu indica día, mes y año, mientras que HH:mm:ss usa el reloj de 24 horas. LocalDateTime no contiene deliberadamente ningún desplazamiento ni zona horaria; por eso, esta opción conserva los campos de fecha y hora locales, pero no identifica un instante único.
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);
}
}
Convierte una fecha analizada a Timestamp con SimpleDateFormat
En código heredado basado en java.util.Date, SimpleDateFormat permite analizar un patrón personalizado. El análisis produce un Date; getTime() devuelve su valor en milisegundos desde la época, que acepta el constructor de Timestamp. SimpleDateFormat usa la zona horaria predeterminada de la JVM, a menos que se configure otra, y es permisivo de forma predeterminada. Configura explícitamente ambas opciones cuando necesites una interpretación predecible. El ejemplo fija UTC y desactiva el análisis permisivo. Además, la API es mutable y no es segura para uso concurrente; no compartas una misma instancia entre operaciones simultáneas.
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());
}
}
Convierte una cadena que contiene solo una fecha a Timestamp con LocalDate.atStartOfDay()
Un valor que contiene solo una fecha no especifica una hora. Analízalo como LocalDate, elige la medianoche como hora deseada mediante atStartOfDay() y convierte el LocalDateTime resultante a Timestamp. Así la suposición queda explícita; no se conserva una hora que no estaba en la entrada.
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);
}
}
Elige entre LocalDateTime y Timestamp
Usa LocalDateTime cuando el valor represente una fecha y hora locales y la aplicación todavía no deba asignarle una zona horaria. Usa Timestamp cuando una API, como JDBC, requiera java.sql.Timestamp; puede almacenar fracciones de segundo y representa un punto de la línea de tiempo mediante su valor en milisegundos. La conversión desde LocalDateTime usa la zona horaria predeterminada de la JVM para obtener ese valor, por lo que los mismos campos locales pueden corresponder a instantes distintos en máquinas con diferentes zonas predeterminadas.
Si la entrada especifica un desplazamiento UTC o una región, analiza y conserva esa información con un tipo java.time que incluya el desplazamiento o la zona antes de convertirla en un instante o en un tipo de base de datos. Ni Timestamp.valueOf() ni LocalDateTime pueden deducir la zona horaria que pretendía usar quien envió el valor. Los tipos de columna de la base de datos y los controladores JDBC también pueden aplicar sus propias reglas de zona horaria; mantén coherentes las suposiciones de almacenamiento y recuperación de la aplicación.