2011-02-01 2 views
5

Il mio server mi invia fusi orari del formato "America/Los Angeles". Sul client, ho un tempo che ho bisogno di visualizzare in quel fuso orario. La risposta sarà "PST" o "PDT", a seconda dell'ora legale all'ora prestabilita. Come faccio quella conversione?Conversione del fuso orario "America/Los Angeles" in "PST" o "PDT" in Java ME

Sono su Java ME (Blackberry 4.7, per essere precisi), quindi non posso usare Joda Time.

Avrò bisogno di fare questo calcolo rapidamente per un sacco di date (ma solo un fuso orario), quindi non posso semplicemente avere il server mandarmi un offset, perché l'offset potrebbe cambiare a seconda della data.

Modifica: Lasciatemi ricomporre il problema, perché sembra esserci un po 'di confusione. Mi viene assegnato un nome zonainfo e una data. Voglio sapere l'offset da GMT in quel fuso orario a quella data. La risposta varierà in base all'ora legale.

Come bonus aggiuntivo, mi piacerebbe ottenere il TLA per mostrare all'utente (ad esempio, "PST" o "PDT"), ma questo è secondario.

Soluzione: Riassumo la soluzione qui, perché non è molto chiara dalle risposte seguenti. Questo fa in sostanza quello che mi serve, in 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

A causa di [questa risposta] (https://stackoverflow.com/a/31171284/659077), "Amrica/Los_angeles" e "PDT" hanno lo stesso offset! –

risposta

6

Forse questo è ciò che desideri. Funziona sulla mia macchina usando java standard.

 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 

Aggiornamento: OP ha detto quanto sopra non funziona per J2ME. Dopo aver cercato su google ho trovato here che getOffset() in realtà è getRawOffset() in j2me. Tuttavia, non assomiglia a supposrts displayName. La tua unica opzione credo sia quella di passare attraverso gli id ​​usando getAvailableIds().

+0

Sarebbe bello, ma J2ME non ha TimeZone.getDisplayName() :-( –

+0

Ho aggiunto anche l'offset per te – CoolBeans

+0

Supporta getOffset()? – CoolBeans

1

Vuol J2ME non supportano TimeZone.getTimeZone(id)? Questo è fondamentalmente quello che vuoi, per ottenere gli offset del fuso orario ecc. Spero che J2ME supporti i nomi delle zone zoneinfo.

+0

Questo mi dà il fuso orario con l'id "America/Los Angeles", che è esattamente uguale a PST, indipendentemente dalla data. –

+0

L'implementazione TimeZone di BlackBerry supporta i nomi di zoneinfo. Credo che il problema OP sia che sta ricevendo abbreviazioni nel fuso orario, non nomi di zoneinfo. Il valore predefinito di BlackBerry è GMT se non è in grado di riconoscere l'abbreviazione. Sfortunatamente, i modelli BB spesso non conoscono molte abbreviazioni. Puoi usare 'TimeZone.getAvailableIDs()' per vedere cosa è supportato su una piattaforma particolare. –

+0

@Ted: la domanda dice che l'OP sta ottenendo il nome di zonainfo. Sono ancora un po 'confuso ... –