我有一个带有Saas网站和注册用户的Java SE服务器应用程序。
我在不同的日子里在我的服务器上发生了很多事件。
时间通过SYSTEM.currentTimeMillis()/1000
注册用户可以从各自的国家/地区查看这些活动时间,他们需要通过网站根据他们的时区(而不是服务器时区)查看正确的时间。
如何向他们展示在他们的时区中的历史时间? 你对如何应对这种情况有任何想法吗?
答案 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)
首先,您需要确定用户的时区。在StackOverflow上搜索以了解最终,最好的方法是询问用户。您可以尝试在浏览器上使用JavaScript来自动检测时区,但是存在问题。
您需要到达proper time zone name,通常是大陆/ 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 );