【问题标题】:Java-Adding timezone to date when date is grabbed from datepicker从日期选择器获取日期时,Java-将时区添加到日期
【发布时间】:2014-01-02 16:34:40
【问题描述】:

我有一个 jsp 页面,它从 jquery 数据选择器中获取值并将其传递给搜索。该网站的用户有机会更改他们的时区以适应他们在世界上的位置。我想获取基于浏览器时间的搜索值并将其格式化并在屏幕上与用户的时区一起显示。

列是 expireDate,我使用数据表来显示结果。

{
    "mData":"expireDate",
    "mRender":function(source,type,full){
    if(-1==source)
    return "";
    var toDate = new Date(source);
    var stringDate = toDate.toString(dateTableFormater);
    return stringDate;

我获取值并传入我自己的自定义格式,格式基于人的居住地。每种格式都不同,具体取决于他们居住的地方,并阻止我使用 simpledateFormat.setTimezoneOffset();

$("#expireFrom").datepicker($.datepicker.regional[plannerLang]);
    $("#expireFrom").datepicker( "option", "dateFormat",dateFormater);
    $("#expireTo").datepicker($.datepicker.regional[plannerLang]);
    $("#expireTo").datepicker( "option", "dateFormat",dateFormater);

我有一个 dto 设置,以便它获取用户时区,我只是不知道如何实现它,所以当时间被发送回 jsp 时,时区已包含在时间中。 如何从浏览器获取的日期中添加/减去时区差异?

【问题讨论】:

  • 顾问只是使用网站的人,他们可以将时区设置为他们想要的任何时间
  • 那你应该说'用户'。您还可以做一些其他事情来简化和集中您的问题。

标签: java jquery jsp timezone datatables


【解决方案1】:

调整时区偏移

计算机以通用方式跟踪时间,无需时区信息。他们使用自epoch 以来的秒/毫秒/纳秒计数。因此,调整时区并不是增加或减少时间本身的问题。这是将那个时间/计数的 表达式 调整为字符串的问题。

乔达时间

捆绑的 java.util.Date/Calendar 类在设计和实现方面都是出了名的糟糕。您应该改用合格的日期时间库。目前,这意味着Joda-Time。将来,在 Java 8 中,您可以继续使用 Joda-Time 或切换到 JSR 310 定义的新捆绑 java.time.* classes。这些类的灵感来自 Joda-Time,但完全重新架构。

Joda-Time 中的 DateTime 实例知道自己的时区,这与 java.util.Date 不同。

服务器时间

大多数程序员发现使用服务器的时钟比从用户的机器获取时间更明智。用户的机器因与正确时间不同步而臭名昭著。对于 Internet 和 NTP 服务器,今天的情况就不那么真实了。不过,我建议您坚持使用服务器的时钟。

您应该从用户的机器上获取他们的Locale 信息、国家(文化)和语言。

顺便说一句,通常最好在您的业务逻辑中使用UTC(无时区偏移)并切换到仅用于向用户展示的时区。

时区示例代码

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Athens" );

DateTime now_Athens = new DateTime( timeZone );
DateTime now_Seattle = now_Athens.toDateTime( DateTimeZone.forID( "America/Los_Angeles" ));
DateTime now_UTC = now_Athens.toDateTime( DateTimeZone.UTC );

转储到控制台...

System.out.println( "now_Athens: " + now_Athens );
System.out.println( "now_Seattle: " + now_Seattle );
System.out.println( "now_UTC: " + now_UTC );

运行时……

now_Athens: 2014-01-02T20:11:43.657+02:00
now_Seattle: 2014-01-02T10:11:43.657-08:00
now_UTC: 2014-01-02T18:11:43.657Z

格式化字符串

Joda-Time 有很多通过formatting 渲染字符串的功能:

  • 您可以使用Locale-sensitive Long、Medium、Short formatters 格式化。
  • 您可以定义自己的格式。
  • 您可以使用标准的ISO 8601 格式,即默认格式,如上所示。

格式化示例代码

DateTimeZone timeZone_Paris = DateTimeZone.forID( "Europe/Paris" );
String nowLocalizedParis = DateTimeFormat.forStyle("LS").withLocale(Locale.FRANCE).withZone( timeZone_Paris ).print( now_UTC );

转储到控制台...

System.out.println( "nowLocalizedParis: " + nowLocalizedParis );

运行时……

nowLocalizedParis: 2 janvier 2014 19:11

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多