如何在Java中使用不同的TimeZone获取当前时间?

时间:2009-11-26 10:05:35

标签: java jsp servlets timezone locale

好的 - 我觉得这个基本问题很愚蠢,但是嘿。

我正在尝试在Java webapp中的不同时区获取当前时间。我尝试过以下明显的解决方案:在我的servlet中,

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

然后我将日历对象作为请求属性'localCalendar'传递给JSP:

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

但我的输出似乎忽略了时区设置,即

It is now: [Thu Nov 26 10:01:03 GMT 2009] in TimeZone Indian/Mahe

我猜这与Locale设置有关,有没有办法在另一个时区为我的Locale设置格式化时间?

3 个答案:

答案 0 :(得分:6)

Calendar的内部数据基本上是:

  

时间瞬间可以用毫秒值表示,该值是1970年1月1日格林威治标准时间1970年1月1日00:00:00.GF格雷戈里奇(格里高利)的偏差。

所以,它保持long,无论你在它上面使用什么操作都是一样的toString没有做出承诺。

您希望根据区域设置和时区格式化日期。您可以使用JSTL之类的东西在表示层(JSP)中执行此操作,也可以使用DateFormat格式化bean中的日期,并将值作为字符串返回。

答案 1 :(得分:3)

如果要以给定格式/时区显示日期,请使用SimpleDateFormat

答案 2 :(得分:0)

answer by McDowell是正确的,但java.util.Calendar(和java.util.Date)类已经过时了。

java.time

java.time框架内置于Java 8及更高版本中,并后端移植到Java 6& 7和Android。这些新类取代了旧的日期时间类,因为它们被证明设计不当,容易混淆和麻烦。

Instant是UTC中的当前时刻。

Instant now = Instant.now();

应用时区ZoneId以获得ZonedDateTime

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

时区与区域设置

请注意,time zoneLocale是正交问题。时区会影响wall clock timeoffset from UTCLocale仅影响演示文稿。区域设置用于(a)人类语言的日期和月份名称,以及(b)关于诸如月前一个月,逗号与期间等问题的文化规范。

例如,在Québécois工作时,您可能会有一位阅读India用户的法语阅读用户。因此,请使用Asia/Kolkata的时区和Locale.CANADA_FRENCH

要生成格式化字符串,请使用DateTimeFormatter类。 Stack Overflow中已存在许多示例。通过withLocale方法指定所需/预期的Locale