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

我正在尝试在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 方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top