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?

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top