Java在从日期选择器获取日期时将时区添加到日期



我有一个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时,时区已经包含在时间中。如何从浏览器获得的日期中添加/减去时区差异?

调整时区偏移

计算机以通用的方式跟踪时间,不包含时区信息。它们使用自epoch以来的秒/毫秒/纳秒计数。因此,调整时区并不是对时间本身进行加减的问题。这是一个将该时间/计数的表达式调整为字符串的问题。

Joda时间

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

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

服务器时间

大多数程序员发现更明智的做法是使用服务器的时钟,而不是从用户的机器上获取时间。用户的机器因与正确的时间不同步而臭名昭著。如今,互联网和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有许多通过格式化呈现字符串的功能:

  • 您可以使用区分区域设置的Long、Medium和Short格式化程序进行格式化
  • 您可以定义自己的格式
  • 您可以使用标准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

相关内容

  • 没有找到相关文章

最新更新