Java:日期和偏移问题?

3

我有一个网络应用程序,如果客户端位于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服务中接收到这个字符串并尝试使用SimpleDateFormat将其解析为日期对象时,它假定我想表达的是:“这是UTC时间10点,而我位于UTC+0000时区”,因此它将其存储为UTC时间上午10:00,而不是上午09:00 UTC时间,这是从上午10:00英国夏令时(BST)转换过来的正确时间。
这是我的示例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个回答

6
这是表示“这是英国夏令时时间,比协调世界时快一小时”的意思。
那么你的问题就在于此。英国夏令时比协调世界时快一小时。因此,11点英国夏令时是10点协调世界时,这就是你的输出结果。你应该多了解一下协调世界时
英国不处于“UTC+0000时区”,而是处于“欧洲/伦敦时区”,冬季为UTC+0,夏季为UTC+1。
(正如Bogdan所说,时区很难处理,Joda Time是一个比Java内置库更好的日期/时间库...但它会给你同样的答案...)
编辑:为了让它变得更加清晰明了,这个值“2012-03-28 10:00:00 +0000”在任何合理的系统中都表示协调世界时上午10点。这就是11点英国夏令时,就像Java向你展示的那样。如果你试图让它表示其他含义,那么你应该停止这样做,因为你将与几乎所有已知的系统不一致。

是的,我知道UTC是如何工作的,但我的问题是我手头只有BST时间,而不是UTC时间。我发送的时间并不是以UTC格式发送的,而是代表了英国夏令时上午10点的时间。我希望JAVA能将我的10:00 AM BST转换为9:00 AM UTC。 - Mo.
@Mo:你似乎不知道UTC的工作原理,因为你在帖子中多次断言英国处于“UTC+0000”,而事实并非如此。BST不是+0000。英国不是UTC+0000时区。时区偏移量是相对于UTC而不是“你所在时区的标准时间”的偏移量。 - Jon Skeet
我所说的BST是指目前我的时间代表英国时间(我的当地时间是上午10:00,而不是UTC上午10:00)。 - Mo.
如果您正在解析任何语言的日期,对于英国,您将具有偏移量为+0000,这是否正确?无论是夏天还是冬天。 - Mo.
@Mo:那么,你有没有找出JavaScript出了什么问题? - Jon Skeet
显示剩余6条评论

1

时区管理是构建Web应用程序中最具挑战性的部分之一 :). 但是,网络上有几个很好的项目为这些情况提供了良好的支持。其中之一就是Joda Time

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接