2012-02-24 37 views
5

Tengo una cadena obtenida llamando al método de instancia toString de la clase Fecha.
¿Cómo puedo obtener un objeto Date de esta cadena?Cómo convertir Date.toString a la fecha?

Date d = new Date(); 
String s = d.toString; 
Date theSameDate = ... 

ACTUALIZACIÓN
He tratado de utilizar SimpleDateFormat, pero me da java.text.ParseException: Unparseable date ¿Me puede decir el formato de fecha producida por Date.toString()?

+0

Pruebe el análisis con, digamos, 'SimpleDateFormat'. – bdares

+1

No use la secuencia. Mantenga el objeto Date y solo se transforma en String cuando sea necesario. – m0skit0

+1

Puede ser una buena idea proporcionar un contexto sobre lo que realmente está tratando de lograr. – flesk

Respuesta

12

Si su objetivo real es serializar un objeto Date de algún tipo de encargo a la persistencia o la transferencia de datos, una solución sencilla sería:

Date d = new Date(); 
long l = d.getTime(); 
Date theSameDate = new Date(l); 
+1

FYI: La molesta 'Fecha' Clase ahora es heredada, reemplazada por' Instant' y las otras clases * java.time *. Ver el enfoque moderno en [esta respuesta] (https://en.m.wikipedia.org/wiki/ISO_8601) por Ole V.V. –

2

Eche un vistazo a SimpleDateFormat#parse(). Debe proporcionar la funcionalidad que está buscando.

+0

Esa clase ahora está obsoleta por 'DateTimeFormatter'. –

-1

Date theSameDate = new Date(Date.parse(s));

Por algunas razones no tan obvias, esto no es una idea especialmente buena. Puede encontrar detalles sobre eso en la documentación de la API para el método de análisis. Un problema es, por ejemplo, que las abreviaturas de zona horaria son ambiguas, por lo que el analizador puede fallar al interpretar la zona horaria correcta.

+0

También 'Date.parse()' quedó obsoleto hace mucho tiempo. –

8

Usted puede hacerlo de esta manera

Date d = new Date(); 
String s = d.toString; 
Date theSameDate = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy").parse(s); 
+0

Este método también funciona con la biblioteca org.json al convertir objetos Java Date a y desde JSONObjects utilizando el constructor de beans, ya que usa Date.toString() al construir JSONObjects. Gracias por esto, es exactamente el formato de SimpleDateFormat que estaba buscando. –

+0

FYI, las viejas clases problemáticas usadas aquí ahora son heredadas, suplantadas por las clases * java.time *. –

2
  1. 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.
  2. 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).

+1

tl; dr 'Instant.parse (Instant.now(). ToString())' –