好的 - 我觉得这个基本问题很愚蠢,但是嘿。
我正在尝试在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设置格式化时间?
答案 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 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 zone和Locale
是正交问题。时区会影响wall clock time,offset from UTC。 Locale
仅影响演示文稿。区域设置用于(a)人类语言的日期和月份名称,以及(b)关于诸如月前一个月,逗号与期间等问题的文化规范。
例如,在Québécois工作时,您可能会有一位阅读India用户的法语阅读用户。因此,请使用Asia/Kolkata
的时区和Locale.CANADA_FRENCH
。
要生成格式化字符串,请使用DateTimeFormatter
类。 Stack Overflow中已存在许多示例。通过withLocale
方法指定所需/预期的Locale
。