Come posso ottenere l'ora corrente in un diverso fuso orario in Java?
Domanda
OK - Mi sento piuttosto stupido a porre una domanda così semplice, ma ehi.
Sto cercando di ottenere l'ora corrente in un fuso orario diverso in una webapp Java. Ho provato la seguente ovvia soluzione: nel mio servlet,
Calendar localCalendar = Calendar.getInstance (myBean.getTimeZone ());
quindi passo l'oggetto del calendario attraverso un JSP come attributo di richiesta 'localCalendar':
It is now: [${requestScope.localCalendar.time}]
in TimeZone ${requestScope.localCalendar.timeZone.ID}
ma la mia uscita sembra ignorare il fuso orario impostato, ovvero
Ora è: [Gio 26 Nov 10:01:03 GMT 2009] in TimeZone Indian / Mahe
Immagino che abbia a che fare con le impostazioni locali, c'è un modo per formattare l'ora per il mio locale, in un altro fuso orario?
Soluzione
I dati interni di Calendar
sono sostanzialmente:
Un istante nel tempo può essere rappresentato da un valore in millisecondi che è un offset rispetto all'epoca, 1 gennaio 1970 00: 00: 00.000 GMT (gregoriano).
Quindi, contiene un long
che sarà lo stesso indipendentemente dalle operazioni che usi su di esso e toString
non fa promesse.
Desideri formattare la data secondo le impostazioni internazionali e il fuso orario. Puoi farlo nel livello di presentazione (JSP) usando cose come JSTL oppure puoi formattare la data nel tuo bean usando un DateFormat e restituisce il valore come stringa.
Altri suggerimenti
Se si desidera visualizzare la data in un determinato formato / fuso orario, utilizzare SimpleDateFormat
La la risposta di McDowell è corretta, ma il java.util.Calendar
(e Le classi java.util.Date
) sono obsolete.
java.time
Il framework java.time è integrato in Java 8 e versioni successive e trasferito a Java 6 & amp; 7 e ad Android. Queste nuove classi soppiantano le vecchie classi di data e ora poiché si sono dimostrate mal progettate, confuse e problematiche.
Un Instant
è il momento attuale in UTC.
Instant now = Instant.now();
Applica un fuso orario ZoneId
per ottenere un ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Fuso orario vs impostazioni locali
Nota che fuso orario e Locale
sono problemi ortogonali. Il fuso orario influisce sul orologio da parete , il offset da UTC . Locale
influisce solo sulla presentazione. Le impostazioni locali vengono utilizzate per (a) linguaggio umano per nome del giorno e del mese e (b) norme culturali relative a questioni quali mese prima del giorno del mese, virgola rispetto al periodo e così via.
Ad esempio, potresti avere una lettura in francese Québécois utente che accede alla tua pagina mentre lavora in India . Quindi usa un fuso orario di Asia / Kolkata
con un Locale.CANADA_FRENCH
.
Per generare una stringa formattata usa Classe DateTimeFormatter
. Esistono già molti esempi in Stack Overflow. Specificare il Locale
desiderato / previsto tramite withLocale
.