如何向用户显示正确的时区?

How to show the correct timezone to users?

我有一个 Java 带有 Saas 网站和注册用户的 SE 服务器应用程序。

我的服务器在不同的日子里发生了很多事件。

时间通过SYSTEM.currentTimeMillis()/1000

在localhost中注册了一个长号

注册用户可以从他们各自的国家查看这些事件时间,他们需要通过网站查看基于他们的时区(而不是服务器时区)的正确时间。

如何向他们显示事件的历史时间在他们的时区? 关于您将如何处理这种情况的任何想法?

最简单的方法是使用 http://momentjs.com/timezone/。想法如下 - 你在 html 标记

中发送这样的东西
<div class="raw-datetime">2014-12-01 12:00:00 UTC+03:00</div>

页面加载后 - 您 运行 javascript 将所有原始日期时间调整为浏览器时区。

首先,我们将使用UTC作为系统中默认且唯一的时区。因为,UTC 时间永远不会倒退或回到未来。夏令时没有时差。 因此,所有应用程序(我们开发并为其用户提供时区支持的应用程序)环境都需要一个 JVM 参数,它提供 UTC based environment.

Timezone JVM 参数用法

-Duser.timezone=UTC

观看次数

对于视图,date/time 对象应根据指定的时区呈现。对于 Java 世界,这由 jstl 中的 formatDate tld 处理。 每个项目本身都包含自己的时区保持逻辑。

User.timeZone : 对于管理面板

一些fmt:formatDate例子

<fmt:formatDate value="${someDateTime}" timeZone="${user.timeZone}" pattern="MMM dd, yyyy - HH:mm:ss.S"/>

有关 formatDate taglib 的更多信息,请查看 link 或 google。

对于表单(从用户获取日期/时间数据)

当您通过表单获取日期信息时,您需要考虑时区并执行时间转换。转换方向为用户时区到UTC。 数据库中的时间应为 UTC 时区。

座右铭是全球保存;在本地显示:)

编辑:

将时区作为用户对象的一个​​子字段,当你想显示时间时将它设置到你的格式化程序中,你可以在JavaSE.

中使用它
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm");
        formatter.setTimeZone(TimeZone.getTimeZone(user.getTimeZone()));

java.time

首先您需要确定用户所在的时区。在 Whosebug 上搜索以了解最终最好的方法是询问用户。您可以尝试在浏览器上使用 JavaScript 来自动检测时区,但存在问题。

您需要达到 proper time zone name,通常是 continent/cityOrRegion,例如 America/MontrealAsia/Kolkata。切勿使用像 ESTIST 这样的 3-4 字母代码,因为它们既不标准化也不唯一。

要本地化日期时间,您需要了解用户的区域设置、人类语言和一套文化规范。

掌握时区后,使用 Java 8 及更高版本中内置的新 java.time 框架。受 Joda-Time 的启发,由 JSR 310 定义,并由 ThreeTen-Extra 项目扩展。

long epochSeconds = … ;
Instant instant = Instant.ofEpochSeconds( epochSeconds );
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant, zoneId);
Locale locale = Locale.CANADA_FRENCH;
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( locale );
String output = zdt.format( formatter );