我有一个网络应用程序,如果客户端(在英国,时区为 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 将它解析为一个日期对象时,它假设我说的是:“这是 10:00 UTC,我位于 UTC +0000 时区”,因此它将其存储为 10:00 AM UTC 时间而不是 09:00 AM UTC 时间,这是从 10:00 AM BST(+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
我该如何解决这个问题?
最佳答案
this is meant to say "This is the date and time BST which is +0000 offset from UTC"
那就是你的问题了。 BST 比 UTC 早一小时。所以 BST 上午 11 点是 UTC 上午 10 点,因此你的输出。您可能应该多读一点 UTC .
英国不处于“UTC+0000 时区”,它处于“欧洲/伦敦时区”,冬季为 UTC+0,夏季为 UTC+1。
(正如 Bogdan 所说,时区很难区分,Joda Time 是一个比内置 Java 库更好的日期/时间库无论如何...但它会给你相同的答案...)
编辑:为了清楚起见,这个值“2012-03-28 10:00:00 +0000”在任何健全的系统中表示世界标准时间上午 10 点。那是英国夏令时上午 11 点,正如 Java 向您展示的那样。如果你想让它有其他含义,你应该停止这样做,因为你将与人类已知的几乎所有系统发生冲突。
关于Java:日期和偏移量问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9925028/