我有一个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