【问题标题】:Apply request TimeZone to stripes:format tag or set default TimeZone for some Locales将请求 TimeZone 应用于 stripes:format 标签或为某些区域设置默认 TimeZone
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 是的,我正在做这一切。我确定用户必须显示德语或英国或任何语言环境都可以。问题在于时区。
  • 更改了我的答案以解决客户的时区偏移检测
  • 为了澄清您编辑的答案,我在决定向用户显示哪个 TimeZone 时没有问题(特别是我想为每个区域设置选择一个特定的 TZ 并将其用于所有使用该 TZ 的用户地区)。我在获取 Stripes 用于呈现条纹的 DateFormat 时确实遇到了问题:格式标签实际上使用该 TimeZone 来呈现日期。
  • 语言环境在概念上与时区无关。例如,像美国这样的国家有一个区域设置,但包含 4 个时区。您将需要手动创建一个区域设置 -> 时区地图。通常更好的方法是从用户的 PC 检测时区
  • 即使假设我从用户的 PC 检测时区,大部分问题仍然有效。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-10-10
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多