- Si su objetivo real es serializar y deserializar una fecha y hora (para transferencia de datos o para persistencia, por ejemplo), serialice a ISO 8601, el formato estándar para datos de fecha y hora.
- Omita la antigua clase obsoleta
Date
. La API moderna de fecha y hora de Java conocida como java.time
es mucho mejor para trabajar. La clase que necesita de ella es probablemente Instant
(esto depende de sus requisitos más exactos).
Los dos puntos van muy bien de la mano:
Instant i = Instant.now();
String s = i.toString();
Instant theSameInstant = Instant.parse(s);
Las modernas clases toString
métodos producen formato ISO 8601 (por ejemplo, 2018-01-11T10:59:45.036Z
), y sus métodos parse
leen el mismo formato espalda. Así que este fragmento es todo lo que necesitas, y obtienes un instante igual al primero, con precisión de nanosegundos.
Si no puede controlar la cadena que se obtiene, y se obtiene el resultado de Date.toString()
, la cadena patrón de formato en Sedalb’s answer trabajos con java.time
también:
DateTimeFormatter dtf
= DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT);
Date d = new Date();
String s = d.toString();
Instant nearlyTheSameInstant = ZonedDateTime.parse(s, dtf).toInstant();
Es esencial para proporcionar un entorno local. De lo contrario, se usará la configuración regional predeterminada de la JVM, y si no es inglés, el análisis fallará. En el peor de los casos, verá que su código funciona correctamente durante muchos años y de repente se romperá cuando un día alguien lo ejecute en una computadora o dispositivo con una configuración regional diferente.
El punto de jambjo’s answer todavía se aplica: Los tres y cuatro letras abreviaturas zona horaria utilizada en Date.toString()
son muy menudo ambigua, por lo que no hay garantía de que la zona horaria es interpretado correctamente, y otra vez, que serán interpretadas de forma diferente en diferentes JVM.
Por último, Date.toString()
no haga al milisegundos que el Date
bodegas, lo que conduce a una imprecisión de hasta 999 milisegundos. Si usamos la cadena de Date.toString()
, no hay nada que podamos hacer al respecto (por eso llamé a la variable nearlyTheSameInstant
).
Pruebe el análisis con, digamos, 'SimpleDateFormat'. – bdares
No use la secuencia. Mantenga el objeto Date y solo se transforma en String cuando sea necesario. – m0skit0
Puede ser una buena idea proporcionar un contexto sobre lo que realmente está tratando de lograr. – flesk