我有一个带有Saas网站和注册用户的Java SE服务器应用程序。
我的服务器在不同的日子里发生了许多事件。
通过SYSTEM.currentTimeMillis()/1000
注册用户可以从他们各自的国家检查这些事件时间,他们需要通过网站看到基于他们的时区(而不是服务器时区)的正确时间。
如何显示他们所在时区中事件的历史时间?你知道你会怎么处理这种情况吗?
最简单的方法是使用http://momentjs.com/timezone/。想法如下-你发送像这样的html标记
<div class="raw-datetime">2014-12-01 12:00:00 UTC+03:00</div>
在页面加载后-你运行javascript调整所有原始日期时间到浏览器的时区
java.time
首先需要确定用户的时区。在StackOverflow上搜索一下,最终最好的方法是询问用户。您可以尝试在浏览器上使用JavaScript来自动检测时区,但是存在一些问题。
您需要到达一个适当的时区名称,通常是大陆/城市地区,如America/Montreal
或Asia/Kolkata
。不要使用像EST
或IST
这样的3-4个字母的代码,因为它们既不标准化也不唯一。
要本地化日期-时间,您需要知道用户的Locale、人类语言和一组文化规范。
有了时区后,使用新的java。时间框架内置于Java 8及以后版本中。受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 );
首先,我们将使用UTC
作为系统中的默认唯一时区。因为,在UTC中,时间永远不会回到过去或走向未来。夏时制没有时间偏移。因此,所有应用程序(我们开发的应用程序并为其用户提供时区支持)环境都需要一个JVM参数,它提供了一个基于UTC的环境。
时区JVM参数使用情况
-Duser.timezone=UTC
For Views
对于视图,日期/时间对象应该根据指定的时区呈现。对于Java世界,这是由formatDate
在jstl
中处理的。每个项目本身都包含自己的时区保持逻辑。
用户。timeZone: for admin panels
一些fmt:formatDate示例
<fmt:formatDate value="${someDateTime}" timeZone="${user.timeZone}" pattern="MMM dd, yyyy - HH:mm:ss.S"/>
有关formatDate标签库的更多信息,请查看链接或谷歌。
For Forms(从用户获取日期/时间数据)
当您通过表单获取日期信息时,需要考虑时区并执行时间转换。转换方向为"用户时区到UTC"。数据库中的时间应该在UTC时区。
座右铭是全局保存;在本地显示:)
编辑:
将timezone作为User对象的子字段,并在想要显示时间时将其设置为格式化程序,您可以在JavaSE
中使用它。
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm");
formatter.setTimeZone(TimeZone.getTimeZone(user.getTimeZone()));