2011-02-01 10 views
5

Mi servidor me envía zonas horarias del formato "América/Los Ángeles". En el cliente, tengo un tiempo que necesito mostrar en esa zona horaria. La respuesta será "PST" o "PDT", dependiendo del horario de verano en el momento dado. ¿Cómo hago esa conversión?La conversión de la "América/Los Ángeles" zona horaria a "PST" o "PDT" en Java ME

Estoy en Java ME (Blackberry 4.7, para ser exactos), por lo que no se puede utilizar Joda Time.

Necesitaré hacer este cálculo rápidamente para muchas fechas (pero solo una zona horaria), así que no puedo simplemente hacer que el servidor me envíe un desplazamiento, porque el desplazamiento puede cambiar según la fecha.

Edit: Permítanme volver a plantear el problema, porque parece haber cierta confusión. Me dieron un nombre de zona y una fecha. Quiero saber el desplazamiento desde GMT en esa zona horaria en esa fecha. La respuesta variará según el horario de verano.

Como un beneficio adicional, me gustaría obtener el TLA para mostrar al usuario (es decir, "PST" o "PDT"), pero eso es secundario.

Solución: voy a resumir aquí la solución, ya que no es muy claro a partir de las respuestas a continuación. Esto básicamente hace lo que necesito, en J2ME:

TimeZone zone = TimeZone.getTimeZone("America/Los_Angeles"); 
Calendar calendar = Calendar.getInstance(); 
calendar.setTimeZone(zone); 

calendar.setTime(new Date(2011, 1, 1, 12, 0, 0));  
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND))); 
calendar.setTime(new Date(2011, 6, 1, 12, 0, 0)); 
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND))); 
+0

Debido a [esta respuesta] (https://stackoverflow.com/a/31171284/659077), 'Amrica/Los_Angeles' y 'PDT' han compensado igual! –

Respuesta

6

puede ser que esto es lo que usted está deseando. Esto funciona en mi máquina usando Java estándar.

 Calendar calendar = Calendar.getInstance();  
     TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles"); 
     calendar.setTimeZone(tz); 
     System.out.println("Offset from UTC="+tz.getOffset(calendar.getTimeInMillis())/(60*60*1000)); //prints -8 
     System.out.println(tz.getDisplayName(Boolean.TRUE, 0)); //prints PDT 
     System.out.println(tz.getDisplayName(Boolean.TRUE, 1)); //prints Pacific Daylight Time 
     System.out.println(tz.getDisplayName(Boolean.FALSE, 0));//prints PST 
     System.out.println(tz.getDisplayName(Boolean.FALSE, 1));//prints Pacific Standard Time 

actualización: OP dijo lo anterior no funciona para J2ME. Después de googlear encontré here que getOffset() es en realidad getRawOffset() en j2me. Sin embargo, no parece que suplique que displayName. Creo que su única opción es ir a través de los identificadores usando getAvailableIds().

+0

que sería grande, pero J2ME no tiene TimeZone.getDisplayName() :-( –

+0

he añadido el offset para usted también. – CoolBeans

+0

¿Es compatible con el getOffset()? – CoolBeans

1

¿Se J2ME es compatible con TimeZone.getTimeZone(id)? Eso es básicamente lo que usted quiere, para obtener las compensaciones de zona horaria, etc. Espero que J2ME admita los nombres de zona zoneinfo.

+0

Eso me da la zona horaria con el ID "América/Los Ángeles", que es exactamente igual a PST, independientemente de la fecha. –

+0

La implementación TimeZone de BlackBerry es compatible con los nombres de zoneinfo. El problema OP, creo, es que está recibiendo abreviaturas de zona horaria, no nombres de zoneinfo. BlackBerry utiliza GMT por defecto si no puede reconocer la abreviatura. Desafortunadamente, los modelos de BB a menudo no conocen muchas abreviaturas. Puede usar 'TimeZone.getAvailableIDs()' para ver qué se admite en una plataforma en particular. –

+0

@Ted: la pregunta dice que OP obtiene el nombre de zoneinfo. Todavía estoy un poco confundido ... –

Cuestiones relacionadas