2011-03-22 18 views
25

Quiero convertir la marca de tiempo 2011-03-10T11: 54: 30.207Z al 10/03/2011 11: 54: 30.207. ¿Cómo puedo hacer esto? Quiero convertir el formato ISO8601 a UTC y luego ese UTC debe ser consciente de la ubicación. Por favor, ayuda¿Cómo puedo convertir una indicación de fecha y hora de aaaa-MM-ddThh: mm: ss: formato SSSZ a MM/dd/aaaa hh: mm: ss.SSS? De ISO8601 a UTC

String str_date="2011-03-10T11:54:30.207Z"; 
DateFormat formatter ; 
Date date ; 
formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss.SSS"); 
date = (Date)formatter.parse(str_date); 
System.out.println("output: " +date); 

Excepción: java.text.ParseException: Fecha unparseable: "2011-03-10T11: 54: 30.207Z"

Respuesta

31

En primer lugar, tiene que ser consciente de que UTC no es un formato, que es una zona horaria, de manera efectiva. Entonces, "convertir de ISO8601 a UTC" realmente no tiene sentido como concepto.

Sin embargo, aquí hay un programa de ejemplo que utiliza Joda Time que analiza el texto en un DateTime y luego lo formatea. Supongo que al un formato es posible que desee usar; realmente no ha brindado suficiente información sobre lo que está tratando de hacer para decir más que eso. Es posible que también desee considerar las zonas horarias ... ¿desea visualizar local vez en el instante especificado? Si es así, deberá calcular la zona horaria del usuario y realizar la conversión de manera apropiada.

import org.joda.time.*; 
import org.joda.time.format.*; 

public class Test { 
    public static void main(String[] args) { 
     String text = "2011-03-10T11:54:30.207Z"; 
     DateTimeFormatter parser = ISODateTimeFormat.dateTime(); 
     DateTime dt = parser.parseDateTime(text); 

     DateTimeFormatter formatter = DateTimeFormat.mediumDateTime(); 
     System.out.println(formatter.print(dt)); 
    } 
} 
+0

Hola, me preguntaba qué representa la "T" y la "Z". –

+2

@KevinZhao: 'T' es solo la forma de separar el tiempo de la fecha; 'Z' es la forma de indicar UTC como la zona horaria - "Zulu time". –

+0

gracias. este realmente me ayudó a final DateTimeFormatter parser = ISODateTimeFormat.dateTime(); parsedDate = parser.parseDateTime (stringDate) .toDate(); –

-3

Uso DateFormat. (Lo sentimos, pero la brevedad de la pregunta no garantiza una respuesta más larga o más detallada.)

+0

Lo sentimos por cualquier inconveniente. Estoy obteniendo Excepción: java.text.ParseException: Fecha inutilizable: "2011-03-10T11: 54: 30.207Z" error ver mi pregunta que he editado. – user617966

0

Ingrese la fecha original en a Date object y luego imprima el resultado con a DateFormat. Es posible que deba dividir la cadena en partes más pequeñas para crear el objeto inicial Date, si the automatic parse method no acepta su formato.

Pseudocódigo:

Date inputDate = convertYourInputIntoADateInWhateverWayYouPrefer(inputString); 
DateFormat outputFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss.SSS"); 
String outputString = outputFormat.format(inputDate); 
+0

Me sale parseException – user617966

+1

String str_date = "2011-03-10T11: 54: 30.207Z"; Formateador de formato de fecha; Fecha de fecha; formateador = new SimpleDateFormat ("dd/MM/aaaa hh: mm: ss.SSS"); date = (Fecha) formatter.parse (str_date); System.out.println ("salida:" + fecha); Excepción: java.text.ParseException: fecha inaplicable: "2011-03-10T11: 54: 30.207Z" – user617966

+1

Por lo que sé SimpleDateFormat NO es seguro para subprocesos, si necesita una solución segura para subprocesos, vaya con joda-time y construya un formateador, por ejemplo, con [PeriodFormatterBuilder] (http://joda-time.sourceforge.net/apidocs/org/joda/time/format/PeriodFormatterBuilder.html) y disfrute de un fácil manejo de las fechas como debería ser. – moritz

0

Es posible que desee echar un vistazo a joda time, que es un poco más fácil de usar que las herramientas nativas de Java fecha, y proporciona muchos patrones de fecha común de pre-construidos.

En respuesta a los comentarios, con más detalle:

Para hacer esto utilizando el tiempo de Joda, se necesitan dos DateTimeFormatters - uno para su formato de entrada para analizar su entrada y uno para el formato de salida para imprimir su salida. Su formato de entrada es un formato estándar ISO, por lo que la clase ISODateTimeFormat de Joda time tiene un método estático con un analizador ya: dateHourMinuteSecondMillis. Su formato de salida no es uno para el que tengan un formateador preconstruido, por lo que tendrá que crear uno usted mismo usando DateTimeFormat. Creo que DateTimeFormat.forPattern("mm/dd/yyyy kk:mm:ss.SSS"); debería hacer el truco. Una vez que tenga sus dos formateadores, llame al método parseDateTime() en el formato de entrada y al método print en el formato de salida para obtener su resultado, como una cadena.

Juntando todo debe ser algo como esto (advertencia, no probado):

DateTimeFormatter input = ISODateTimeFormat.dateHourMinuteSecondMillis(); 
DateTimeFormatter output = DateTimeFormat.forPattern("mm/dd/yyyy kk:mm:ss.SSS"); 
String outputFormat = output.print(input.parseDate(inputFormat)); 
+0

Obtengo Excepción: java.text.ParseException: Fecha inutilizable: "2011-03-10T11: 54: 30.207Z" error ver mi pregunta que he editado. – user617966

+0

He descargado tiempo joda pero no sé cómo convertir ISO8601 a formato UTC. Por favor, guía – user617966

+0

@ user617966: UTC no es un formato, es una zona horaria (efectivamente). –

28

Sí. puedes usar SimpleDateFormat así.

SimpleDateFormat formatter, FORMATTER; 
formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
String oldDate = "2011-03-10T11:54:30.207Z"; 
Date date = formatter.parse(oldDate.substring(0, 24)); 
FORMATTER = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss.SSS"); 
System.out.println("OldDate-->"+oldDate); 
System.out.println("NewDate-->"+FORMATTER.format(date)); 

salida OldDate -> 2011-03-10T11: 54: 30.207Z NewDate -> 10-Mar-2011 11:54:30.207

+2

cara a cara, 'hh' en minúsculas es formato de 12 horas,' HH' es 24 horas –

0

espero que esto ayude:

public String getSystemTimeInBelowFormat() { 
    String timestamp = new SimpleDateFormat("yyyy-mm-dd 'T' HH:MM:SS.mmm-HH:SS").format(new Date()); 
    return timestamp; 
} 
Cuestiones relacionadas