¿Cómo puedo mostrar una cita con una zona horaria personalizada?
-
19-09-2019 - |
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);
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?
- Java SE 8 y SE 9 y más tarde
- incorporado.
- Parte de la API estándar de Java con una aplicación incluida.
- Java 9 añade 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 y 7 en ThreeTen-Backport .
- Android
- ThreeTenABP se adapta proyecto ThreeTen- backport (mencionado anteriormente) para Android específicamente.
- ¿Cómo utilizar ... .
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 .