Pregunta

OK, me siento bastante tonto haciendo una pregunta tan básica, pero bueno.

Estoy tratando de obtener la hora actual en una zona horaria diferente en una aplicación web Java. He intentado la siguiente solución obvia: en mi servlet,

Calendar localCalendar = Calendar.getInstance (myBean.getTimeZone ());

luego paso el objeto de calendario a un JSP como un atributo de solicitud 'localCalendar':

It is now: [${requestScope.localCalendar.time}]
in TimeZone ${requestScope.localCalendar.timeZone.ID}

pero mi salida parece ignorar el conjunto de zonas horarias, es decir,

Ahora es: [jue 26 de noviembre 10:01:03 GMT 2009] en TimeZone Indian / Mahe

Supongo que tiene algo que ver con la configuración regional, ¿hay alguna forma de formatear la hora para mi localidad, en otra zona horaria?

¿Fue útil?

Solución

Los datos internos de Calendar son básicamente:

  

Un instante en el tiempo puede ser representado por un valor de milisegundos que es un desplazamiento de la época, 1 de enero de 1970 00: 00: 00.000 GMT (gregoriano).

Por lo tanto, contiene un largo que será el mismo sin importar las operaciones que use en él y toString no hace promesas.

Desea formatear la fecha según la configuración regional y la zona horaria. Puede hacer esto en la capa de presentación (JSP) usando cosas como JSTL o puede formatear la fecha en su bean utilizando un DateFormat y devuelve el valor como una cadena.

Otros consejos

Si desea mostrar la fecha en un formato / zona horaria dada, use SimpleDateFormat

La respuesta de McDowell es correcta, pero el java.util.Calendar (y Las clases java.util.Date ) están pasadas de moda.

java.time

El marco java.time está integrado en Java 8 y posterior, y se transfiere a Java 6 & amp; 7 y para Android. Estas nuevas clases suplantan a las antiguas clases de fecha y hora, ya que han demostrado ser pobremente diseñadas, confusas y problemáticas.

Un Instantáneo es el momento actual en UTC.

Instant now = Instant.now();

Aplique una zona horaria ZoneId para obtener un ZonedDateTime .

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Zona horaria versus configuración regional

Tenga en cuenta que zona horaria y Locale son problemas ortogonales. La zona horaria afecta la hora del reloj de pared , la desplazamiento de UTC . Locale afecta solo a la presentación. La configuración regional se usa para (a) el lenguaje humano para el nombre del día y el mes, y (b) las normas culturales con respecto a cuestiones como el mes anterior al día del mes, la coma versus el período, etc.

Por ejemplo, puede tener un en francés Qu & # 233; b & # 233; cois usuario accediendo a su página mientras trabaja en India . Utilice una zona horaria de Asia / Kolkata con un Locale.CANADA_FRENCH .

Para generar una cadena formateada, use DateTimeFormatter clase. Ya existen muchos ejemplos en Stack Overflow. Especifique el Locale deseado / esperado a través de withLocale método.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top