Java:日期和偏移问题?

时间:2012-03-29 12:11:11

标签: java date simpledateformat

我有一个Web应用程序,如果客户端(在英国时区UTC + 0000)我将日期参数发送为字符串,如下所示:

date = "2012-03-28 10:00:00 +0000" // this is meant to say "This is the date and time BST which is +0000 offset from UTC"

但是当我在我的Java REST服务中收到这个字符串并尝试使用SimpleDateFormater将其解析为日期对象时,它假定我说的是:“这是UTC时间10点,我位于UTC +0000时区“因此它将其定位为UTC时间上午10:00而不是UTC时间上午09:00,这是从BST上午10:00(即+0000)开始的正确对话。

这是我的示例java代码:

String dateString = "2012-03-28 10:00:00 +0000";
Timestamp timestamp= null;
try{
DateFormat planningDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
Date date = planningDateFormat.parse(dateString);
timestamp = new Timestamp(date.getTime());
System.out.println("Time stamp value is: " + timestamp.getTime());
System.out.println("Date value after parse: " + date);
System.out.println("Time value passed in was: " + dateString);
}
catch(Exception e){}

输出:

$ java TimeTest 
Time stamp value is: 1332917100000
Date value after parse: Wed Mar 28 11:00:00 BST 2012
Time value passed in was: 2012-03-28 10:00:00 +0000

如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

  

这意味着“这是BST的日期和时间,它与UTC的偏移量为+0000”

那时那是你的问题。 BST比UTC早一个小时。所以BST上午11点是UTC时间,因此你的输出。您应该在UTC上阅读更多内容。

英国在“timezone UTC + 0000”中位于“timezone Europe / London”,冬季为UTC + 0,夏季为UTC + 1。

(正如Bogdan所说,时区很难,Joda Time是一个比内置的Java 更好的日期/时间库 ...但它会给你同样的答案......)

编辑:只是为了说清楚,这个值“2012-03-28 10:00:00 +0000”表示在任何理智的系统中的上午10点UTC。那是早上11点的BST,正如Java向你展示的那样。如果你试图让它意味着别的东西,你应该停止这样做,因为你将与人类已知的每个系统不一致。

答案 1 :(得分:1)

TimeZone管理是构建Web应用程序时最具挑战性的部分之一:)。但是网上有几个很好的项目可以为这些案例提供很好的支持。其中一个是Joda Time

  

http://joda-time.sourceforge.net/