0

我的应用程序的用户是全球性的,但大多数人没有用户配置文件来保存他们首选的时区信息,所以我想根据他们的语言设置做出最大努力的猜测。

例如,如果使用他们选择 en_US 的语言选择按钮,那么我将在纽约 TZ 中呈现日期,如果 en_GB 则在伦敦 TZ 中呈现日期,如果 de_DE 则在柏林 TZ 中等等。

我正在使用带有类似代码的Stripes 框架...

<stripes:format value="${someDateValue}" formatType="datetime" formatPattern="medium"/>

...在很多地方,并且不想通过所有这些来更新到其他东西(自定义标签或其他)。我也宁愿避免使用 JavaScript AJAX 解决方案(主要是因为我认为它们也会导致我更新很多条带:格式标签)。

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 将是一个自定义的 Stripes 标签,然后在我格式化日期的许多地方进行更改,但在走这条路线之前,我想检查一下我没有错过一些简单的解决方案(Stripes 钩子或一种方式在更基本的 Java 语言环境处理级别上更改它)。

4

2 回答 2

0

用户的时区偏移量不包含在 HTTP 标头上。一般有两种做法:

  1. 创建具有时区设置的用户配置文件,允许用户进行设置
  2. 使用 javascript 的 Date 对象自动检测时区getTimezoneOffset()并使用 ajax 将其发布到服务器。例如在网上搜索这个。

或者你可以将两者结合起来

于 2013-09-05T07:33:19.387 回答
0

以这种方式实现它,它似乎工作正常:

  • 添加自定义 DateFormatter 的自定义 Stripes FormatterFactory
  • DateFormatter 从会话中获取时区偏移量,从 ThreadLocal 获取会话,并使用它来调整用于呈现日期的 DateFormat
  • 拦截器将会话的时区偏移存储到 ThreadLocal
  • 页面上的 JQuery AJAX 调用以将 JavaScript 获得的时区偏移量提交到后端,并将其存储在会话中
于 2013-09-07T23:19:49.550 回答