如何在Java中使用不同的TimeZone获取当前时间?
题
好的 - 我觉得这个基本问题很愚蠢,但是嘿。
我正在尝试在Java webapp中的不同时区获取当前时间。我尝试过以下明显的解决方案:在我的servlet中,
Calendar localCalendar = Calendar.getInstance(myBean.getTimeZone());
然后我将日历对象作为请求属性'localCalendar'传递给JSP:
It is now: [${requestScope.localCalendar.time}]
in TimeZone ${requestScope.localCalendar.timeZone.ID}
但我的输出似乎忽略了时区设置,即
现在是:[2009年11月26日10:01:03 GMT 2009] TimeZone Indian / Mahe
我猜这与Locale设置有关,有没有办法在另一个时区为我的Locale设置格式化时间?
解决方案
Calendar
的内部数据基本上是:
时间瞬间可以用毫秒值表示,该值是1970年1月1日格林威治标准时间1970年1月1日00:00:00.GF格雷戈里奇(格里高利)的偏差。
所以,它持有一个 long
,无论你在它上面使用什么操作, toString
都没有做出任何承诺。
您希望根据区域设置和时区格式化日期。您可以使用诸如 JSTL 或者您可以使用 DateFormat 并将值作为字符串返回。
其他提示
如果要以给定格式/时区显示日期,请使用 SimpleDateFormat
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 );
时区与区域设置
请注意时区和 Locale
是正交问题。时区影响挂钟时间,偏离UTC 。 Locale
仅影响演示文稿。区域设置用于(a)人类语言的日期和月份名称,以及(b)关于诸如月前一个月,逗号与期间等问题的文化规范。
例如,您可能有法语阅读 Qué bé cois 用户在印度。因此,请使用 Asia / Kolkata
的时区 Locale.CANADA_FRENCH
。
要生成格式化字符串,请使用 DateTimeFormatter
类。 Stack Overflow中已存在许多示例。通过 Locale .util.Locale-“rel =”nofollow noreferrer“> withLocale
方法。