如何向用户显示正确的时区?
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/Montreal
或 Asia/Kolkata
。切勿使用像 EST
或 IST
这样的 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 );
我有一个 Java 带有 Saas 网站和注册用户的 SE 服务器应用程序。
我的服务器在不同的日子里发生了很多事件。
时间通过SYSTEM.currentTimeMillis()/1000
注册用户可以从他们各自的国家查看这些事件时间,他们需要通过网站查看基于他们的时区(而不是服务器时区)的正确时间。
如何向他们显示事件的历史时间在他们的时区? 关于您将如何处理这种情况的任何想法?
最简单的方法是使用 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/Montreal
或 Asia/Kolkata
。切勿使用像 EST
或 IST
这样的 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 );