【发布时间】:2013-09-05 07:22:45
【问题描述】:
我的应用程序的用户是全球性的,但大多数人没有用户个人资料来保存他们首选的时区信息,所以我想根据他们的语言设置做出最大努力的猜测。
例如,如果使用他们选择 en_US 的语言选择按钮,那么我将在纽约 TZ 中呈现日期,如果 en_GB 则在伦敦 TZ 中呈现日期,如果 de_DE 则在柏林 TZ 中呈现日期等等。
我正在使用Stripes Framework 和类似...的代码
<stripes:format value="${someDateValue}" formatType="datetime" formatPattern="medium"/>
...在很多地方,并且不想通过所有这些来更新到其他东西(自定义标签或其他)。我也宁愿避免JavaScript AJAX solutions(主要是因为我认为它们也会导致我更新很多条纹:格式标签)。
Stripes Framework 将为请求区域设置使用默认的 DateFormat,这一切正常(随着日期格式的变化)。但是所有时区都保留在服务器 TZ (GMT) 中。
所以我想要一些方法来为 DateFormat.getDateInstance() 返回的默认 DateFormat-s 设置 TimeZone,并且在它们返回之前类似,但我不知道该怎么做。
到目前为止,我尝试的是在返回的 DateFormat 实例上设置它,但当然它是按值返回的,所以它不起作用:
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, new Locale("en_US"));
System.out.println(df.getTimeZone().getDisplayName()); // prints Greenwich Mean Time
df.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println(df.getTimeZone().getDisplayName()); // prints Eastern Standard Time
df = DateFormat.getDateInstance(DateFormat.SHORT, new Locale("en_US"));
System.out.println(df.getTimeZone().getDisplayName()); // prints Greenwich Mean Time again, although if this approach were successful it would print Eastern Standard Time
任何想法如何最好地解决这个问题?
我的计划 B 将是一个自定义条纹标签,然后在我格式化日期的许多地方进行更改,但在走这条路线之前,我想检查一下我没有错过一些简单的解决方案(条纹挂钩,或在更基本的 Java 语言环境处理级别上更改它的方法)。
【问题讨论】:
-
如果您试图做出“最佳猜测”,语言不是最好的方法。例如,美国有多个时区。您应该考虑使用jsTimeZoneDetect,这仍然是一个猜测,但更准确一些。
-
是的,我知道这些限制。但无论如何,问题不在于如何最好地确定要使用的 TZ(顺便说一句,jsTimeZoneDetect 似乎是一个不错的解决方案,感谢链接),而是如何最好地将其应用于 Stripes 框架呈现的日期。
-
抱歉,我对该框架的了解不够多,无法提供进一步的帮助。但总的来说,许多框架很难在全局范围内设置时区,您必须在每次调用时传递它。不过,该规则有一些例外。我不确定 Stripes。
-
这个从请求语言环境中获取时区(我改变了)。因此,我的想法是,如果我可以更改多个区域设置的默认时区,那将自动解决问题。所以从某种意义上说,这不仅仅是一个 Stripes 框架问题,还是一个“Java date/i18n 可以像这样参数化”的问题。
标签: java date timezone date-format stripes