2010-11-17 20 views
9

tengo una cadena en el patrón hh yyyy-MM-dd: mm a y puedo conseguir el objeto de zona horaria por separado en la que la cadena anterior representa la fecha.conversión de cadena hasta la fecha con zona horaria

Quiero convertir esto al siguiente formato. aaaa-MM-dd HH: mm: ss Z

¿Cómo puedo hacer esto?

+0

http://joda-time.sourceforge.net/ hace que todas las manipulaciones de fecha en Java sean mucho más fáciles – NimChimpsky

+0

@Emil llegué a conocer esta característica después de decir :), Gracias. – John

+1

FYI, el proyecto [Joda-Time] (http://www.joda.org/joda-time/) se encuentra ahora en [modo de mantenimiento] (https://en.wikipedia.org/wiki/Maintenance_mode), con el equipo recomienda la migración a las clases [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). –

Respuesta

5

Uso SimpleDateFormat

String string1 = "2009-10-10 12:12:12 "; 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z") 
sdf.setTimeZone(tz); 
Date date = sdf.parse(string1); 
+0

algunas veces el getID() devuelve la cadena como esta "América/Argentina/Ushuaia". Entonces, ¿cómo puedo usarlo – John

+0

-1: esto lanzará ParseException en la mayoría de las zonas horarias. –

+0

@Michael Konietzka @shal Me di prisa me perdí eso, actualicé la respuesta –

0

crear una nueva instancia de SimpleDateFormat la utilización de su patrón de fecha. Después puede llamar a su método de análisis para convertir cadenas de fecha en un objeto java.util.Date.

16

Puede utilizar SimpleDateFormat con yyyy-MM-dd HH:mm:ss y establecer explícitamente los TimeZone:

public static Date getSomeDate(final String str, final TimeZone tz) 
    throws ParseException { 
    final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm a"); 
    sdf.setTimeZone(tz); 
    return sdf.parse(str); 
} 

/** 
* @param args 
* @throws IOException 
* @throws InterruptedException 
* @throws ParseException 
*/ 
public static void main(final String[] args) throws ParseException { 
    final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); 
    System.out.println(sdf.format(getSomeDate(
     "2010-11-17 01:12 pm", TimeZone.getTimeZone("Europe/Berlin")))); 
    System.out.println(sdf.format(getSomeDate(
     "2010-11-17 01:12 pm", TimeZone.getTimeZone("America/Chicago")))); 
} 

Imprime:

2010-11-17 13:12:00 +0100

2010- 11-17 20:12:00 +0100

Actualización 2010-12-01: Si desea salidas impresas explícitamente una zona horaria especial, establecido en el SimpleDateFormat:

sdf.setTimeZone(TimeZone .getTimeZone("IST")); 
System.out.println(sdf.format(getSomeDate(
    "2010-11-17 01:12 pm", TimeZone.getTimeZone("IST")))); 

que imprime 2010-11-17 13:12:00 +0530

+0

Gracias Mr.Michael, La fecha y la hora cambian según la zona horaria.Nota abajo del +100, no cambia el desplazamiento TIMEZONE – John

+0

@shal : Lo siento, no entiendo tu segunda oración. ¿Crees que algo está mal? –

+0

@ Michael, digo que el tiempo se está convirtiendo correctamente, pero ver la parte "Z" en los valores de fecha impresos "+0100" no cambia. Por ejemplo, si estoy convirtiendo una fecha de GMT a IST, entonces la " Z "parte de la fecha convertida debe ser" +0530 ". – John

0

Sin lugar a dudas, el formato que se utiliza generalmente ser de una forma 2014-10-05T15:23:01Z (TZ)

para que uno tiene que utilizar este código

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
String dateInString = "2014-10-05T15:23:01Z"; 

try { 

    Date date = formatter.parse(dateInString.replaceAll("Z$", "+0000")); 
    System.out.println(date); 

} catch (ParseException e) { 
    e.printStackTrace(); 
} 

Su salida será el dom 05 de octubre 20:53:01 IST 2014

Sin embargo, no estoy seguro de por qué teníamos que reemplazarToda "Z" si no agrega replaceTodo el programa fallará.

4

tl;

LocalDateTime.parse( // Parse string as value without time zone. 
    "2017-01-23 12:34 PM" , 
    DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a") 
).atZone(ZoneId.of("America/Montreal")) // Assign time zone. 
.toString()    // Generate string: 2017-01-23T17:34:00Z 
.replace("T" , " ") // Substitute SPACE for 'T' in middle. 
.replace("Z" , " Z") // Insert SPACE before 'Z'. 

Evita legado clases de fecha y hora dr

las otras respuestas utilizan las clases problemáticas pasados ​​de fecha y hora (Date, Calendar, etc.), ahora legado, suplantado por el clases java.time

LocalDateTime

I tienen una cadena en el patrón hh aaaa-MM-dd: mm a Tal cadena de entrada

carece de cualquier indicación de desplazamiento-de-UTC o la zona horaria. Entonces analizamos como LocalDateTime.

Defina un patrón de formato para que coincida con su entrada con un objeto DateTimeFormatter.

String input = "2017-01-23 12:34 PM" ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a"); 
LocalDateTime ldt = LocalDateTime.parse(input , f); 

ldt.toString(): 2017-01-23T12: 34

Tenga en cuenta que una LocalDateTime es no un momento específico, solamente una idea vaga sobre una gama de posibles momentos . Por ejemplo, unos minutos después de la medianoche en París, Francia sigue siendo "ayer" en Montreal, Canadá. Entonces, sin el contexto de una zona horaria como Europe/Paris o America/Montreal, simplemente decir "unos minutos después de la medianoche" no tiene ningún significado.

ZoneId

y puedo conseguir el objeto de zona horaria por separado en el que la cadena anterior representa la fecha.

Una zona horaria está representada por la clase ZoneId.

Especifique un proper time zone name en el formato de continent/region, como America/Montreal, Africa/Casablanca, o Pacific/Auckland. Nunca use la abreviatura de 3-4 letras como EST o IST ya que son no zonas horarias verdaderas, no estandarizadas, y ni siquiera únicas (!).

ZoneId z = ZoneId.of("America/Montreal"); 

ZonedDateTime

Aplicar la ZoneId para obtener una ZonedDateTime que es de hecho un punto de la línea de tiempo, un momento específico de la historia.

ZonedDateTime zdt = ldt.atZone(z); 

zdt.toString(): 2017-01-23T12: 34-05: 00 [América/Montreal]

Instant

quiero convertir esto el siguiente formato. aaaa-MM-dd HH: mm: ss Z

En primer lugar, saber que un carácter literal Z es la abreviatura de Zulu y significa UTC. En otras palabras, un offset-from-UTC de cero horas, +00:00.

La clase Instant representa un momento en la línea de tiempo en UTC con una resolución de nanoseconds (hasta nueve (9) dígitos de una fracción decimal).

Puede extraer un objeto Instant de ZonedDateTime.

Instant instant = zdt.toInstant(); // Extracting the same moment but in UTC. 

para generar una cadena en formato estándar ISO 8601, como 2017-01-22T18:21:13.354Z, llame toString. El formato estándar no tiene espacios, usa un T para separar el año-mes-fecha de la hora-minuto-segundo, y agrega el Z canónicamente para un desplazamiento de cero.

String output = instant.toString(); 

instant.toString(): 2017-01-23T17: 34: 00Z

I sugieren fuertemente utilizando los formatos estándar siempre que sea posible. Si insistes en usar espacios como en el formato deseado, define tu propio patrón de formateo en un objeto DateTimeFormatter o simplemente haz una manipulación de cadena en el resultado de Instant::toString.

String output = instant.toString() 
         .replace("T" , " ") // Substitute SPACE for T. 
         .replace("Z" , " Z"); // Insert SPACE before Z. 

de salida: 23/01/2017 17:34:00 Z

Prueba este code live at IdeOne.com.


Sobre java.time

El marco java.time está incorporado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas clases de fecha y hora legacy, como java.util.Date, Calendar, & SimpleDateFormat.

El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a las clases java.time.

Para obtener más información, consulte el Oracle Tutorial. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.

¿Dónde obtener las clases java.time?

  • Java SE 8 y SE 9 y más tarde
    • incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas características menores y correcciones.
  • Java SE 6 y SE 7
    • Gran parte de la funcionalidad de back-java.time está portado a Java 6 & 7 en ThreeTen-Backport.
  • Android

El proyecto se extiende ThreeTen-Extra java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter y more.

Cuestiones relacionadas