2009-07-22 26 views
8

Digamos que tengo una cadena que representa una fecha que tiene este aspecto:¿Cómo se muestra una fecha con una zona horaria personalizada?

"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 correcto. Ahora quiero mostrar esta fecha como un valor CDT.

He intentado muchas cosas, y simplemente no puedo hacer que funcione correctamente. Debe haber un método simple usando la clase DateFormat para que esto funcione. ¿Algún consejo? Mi último intento fue la siguiente:

formatter.setTimeZone(toTimeZone); 
String result = formatter.format(fromDate); 

Respuesta

16

Uso "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 utilizar Joda Time, que es una API por completo mejor.

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

+0

Lamentablemente no puedo agregar otra dependencia sin más burocracia que quiero tratar. Debe haber una forma de formatear las zonas horarias utilizando las bibliotecas estándar de Java. –

+0

Hay, como se da en la respuesta. Solo espera más dolor si tienes que manipular cualquier otra fecha/hora. –

+0

No está ayudando. El formateador siempre escupe el tiempo en GMT y no el CDT requerido. –

2

Usando:

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

salidas:

Wed Jul 08 12:08:48 CDT 2009 

para la fecha en su ejemplo le en mi máquina. Eso es después de sustituir zzz por ZZZ en la cadena de formato.

2

Lo siento por descubrir un viejo hilo. Pero me preguntaba si hay una clase Java que tenga todos los identificadores de zona horaria 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 uniforme estándar /:

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

donde SomeConstantClass .java es una clase que contiene las constantes que hacen referencia a los diferentes identificadores de zona horaria que admite la clase TimeZone.

1

La manera moderna es con las clases java.time.

ZonedDateTime

especificar 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é idioma humano usar para 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 eso en cualquier otra zona horaria.

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

Supongo que por CDT quiere decir 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

Generalmente mejor manera de trabajar en UTC. Para ese extracto un Instant. 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).

Esta clase Instant es una clase básica básica de java.time. Puede pensar en ZonedDateTime como Instant más ZoneId.

Instant instant = zdtChicago.toInstant(); 

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


Sobre java.time

java.time El marco está construido en Java y 8 luego. Estas clases suplantan a las viejas y problemáticas clases de fecha y hora legacy, como java.util.Date, .Calendar, & java.text.SimpleDateFormat. El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a 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 ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) para Android específicamente.
    • Ver How to use….

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