我的应用程序的用户是全球性的,但大多数人没有用户配置文件来保存他们首选的时区信息,所以我想根据他们的语言设置做出最大努力的猜测。
例如,如果使用他们选择 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 语言环境处理级别上更改它)。