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

时间:2015-09-21 14:07:09

标签: java timezone

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

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

时间通过SYSTEM.currentTimeMillis()/1000

在localhost中以长号注册

注册用户可以从各自的国家/地区查看这些活动时间,他们需要通过网站根据他们的时区(而不是服务器时区)查看正确的时间。

如何向他们展示在他们的时区中的历史时间? 你对如何应对这种情况有任何想法吗?

3 个答案:

答案 0 :(得分:1)

最简单的方法是使用http://momentjs.com/timezone/。想法如下 - 你在html标记中发送这样的东西

<div class="raw-datetime">2014-12-01 12:00:00 UTC+03:00</div>

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

答案 1 :(得分:0)

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

时区JVM参数用法

-Duser.timezone=UTC

视图

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

User.timeZone:用于管理面板

一些fmt:formatDate示例

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

有关formatDate taglib的详细信息,请参阅链接或google。

表格(获取用户的日期/时间数据)

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

座右铭是全球拯救它;在本地展示:)

<强> 编辑:

将时区保留为User对象的子字段,并在想要显示时间时将其设置为格式化程序,您可以在JavaSE中使用它。

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

答案 2 :(得分:0)

java.time

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

您需要到达proper time zone name,通常是大陆/ 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 );