Pregunta

Digamos que tengo una cadena que representa una fecha que tiene este aspecto:

"Wed Jul 08 17:08:48 GMT 2009"

Así que analizar dicha cadena en un objeto fecha de la siguiente manera:

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy");
Date fromDate = (Date)formatter.parse(fromDateString);

Eso me da el objeto de fecha correcta. Ahora quiero mostrar esta fecha como un valor CDT.

He intentado muchas cosas, y yo simplemente no puede conseguir que funcione correctamente. Tiene que haber un método simple uso de la clase DateFormat a conseguir que esto funcione. ¿Algún consejo? Mi último intento fue la siguiente:

formatter.setTimeZone(toTimeZone);
String result = formatter.format(fromDate);
¿Fue útil?

Solución

Utilice "ZZZ" en lugar de "ZZZ":. "Z" es el símbolo de una zona horaria RFC822

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");

Una vez dicho esto, mi consejo estándar en la materia fecha / hora es usar Joda Time , que es un mejor conjunto de API.

EDIT: corto pero completo programa:

import java.text.*;
import java.util.*;

public class Test
{
    public List<String> names;

    public static void main(String [] args)
        throws Exception // Just for simplicity!
    {
        String fromDateString = "Wed Jul 08 17:08:48 GMT 2009";
        DateFormat formatter = new SimpleDateFormat
            ("EEE MMM dd HH:mm:ss zzz yyyy");
        Date fromDate = (Date)formatter.parse(fromDateString);
        TimeZone central = TimeZone.getTimeZone("America/Chicago");
        formatter.setTimeZone(central);
        System.out.println(formatter.format(fromDate));
    }
}

Salida: Wed Jul 08 12:08:48 CDT 2009

Otros consejos

Uso:

formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));

salidas:

Wed Jul 08 12:08:48 CDT 2009

En la fecha en su ejemplo en mi máquina. Es decir después de sustituir zzz para ZZZ en la cadena de formato.

Lo siento por la excavación de un antiguo hilo. Pero me preguntaba si hay una clase Java que contiene todos los husos horarios-ids como una clase constante. Así que en lugar de tener que codificar la zona horaria-id mientras que la creación de zona horaria como esto:

formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));

que en vez estaríamos haciendo algo más estándar / uniforme:

formatter.setTimeZone(TimeZone.getTimeZone(SomeConstantClass.US_CENTRAL)); 

donde SomeConstantClass.java es una clase que tiene las constantes se hace referencia a las diferentes zona de tiempo-ids que son compatibles con la clase de zona horaria.

La forma moderna es con las clases java.time.

ZonedDateTime

Especifica un patrón de formato para que coincida con su cadena de entrada. Los códigos son similares a SimpleDateFormat pero no exactamente. Asegúrese de leer el documento de clase para DateTimeFormatter . Tenga en cuenta que especificamos un Locale para determinar qué lenguaje humano para utilizar el nombre del día de la semana y el nombre del mes.

String input = "Wed Jul 08 17:08:48 GMT 2009";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss z uuuu" , Locale.ENGLISH );
ZonedDateTime zdt = ZonedDateTime.parse ( input , f );
  

zdt.toString (): 2009-07-08T17: 08: 48Z [GMT]

Podemos ajustar que en cualquier otra zona horaria.

zona horaria Nombre adecuada en el formato de continent/region. Nunca use el 3-4 abreviatura de letras tales como CDT o EST o IST ya que no son verdaderas zonas de tiempo, no estandarizados, y ni siquiera únicas (!).

Voy a suponer que por CDT que significaba una zona horaria como America/Chicago.

ZoneId z = ZoneId.of( "America/Chicago" );
ZonedDateTime zdtChicago = zdt.withZoneSameInstant( z );
  

zdtChicago.toString () 2009-07-08T12: 08: 48-05: 00 [América / Chicago]

Instant

En general, la mejor manera de trabajar en UTC. Para que el extracto de una Instant. El Instant clase representa un momento en el línea de tiempo en UTC con una resolución de nanosegundos (hasta nueve (9) dígitos de una fracción decimal).

Esta clase es una clase Instant bloque de construcción básico de java.time. Se puede pensar en ZonedDateTime como Instant más un ZoneId.

Instant instant = zdtChicago.toInstant();
  

instant.toString (): 2009-07-08T17: 08: 48Z


Acerca de java.time

El java.time marco está construido en Java 8 y versiones posteriores. Estas clases sustituyen a los viejos molestos href="https://en.wikipedia.org/wiki/Legacy_system" como java.util.Date , .Calendar , y java.text.SimpleDateFormat .

El href="http://www.joda.org/joda-time/" rel="nofollow noreferrer"> Joda-Time proyecto , ahora en el modo de mantenimiento , aconseja migración a java.time.

Para obtener más información, consulte la Oracle Tutorial . Y la búsqueda de desbordamiento de pila durante muchos ejemplos y explicaciones. Especificación es JSR 310 .

¿Dónde obtener las clases java.time?

El rel="nofollow noreferrer"> ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles futuras adiciones a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter , y más .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top