我遇到使用Java格式化日期的问题。日期格式化程序似乎使用BST(英国夏令时)解析我的字符串,而不是在下面的代码中的dateStr字符串中由+0000定义的GMT + 0。
String dateStr = "Tue Oct 02 01:06:00 +0000 2012";
DateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy");
Date date = df.parse(dateStr);
// Test the date
System.out.println(date.toString());
当我运行上面的代码时,我得到:
Tue Oct 02 02:06:00 BST 2012
这显然不是我想要的。一个有用的信息点可能是当我运行以下内容时:
System.out.println(TimeZone.getDefault().getDisplayName());
我明白了:
Greenwich Mean Time
我想要的输出是
Tue Oct 02 01:06:00 GMT 2012
我已经在df上尝试过.setTimeZone但无济于事。
答案 0 :(得分:2)
请注意,TUE Oct 02 02:06:00 BST 2012与Tue Oct 02 01:06:00 +0000 2012同时出现,仅表示在不同的时区。 java.util.Date
并不真正处理时区,因此就其而言,没有区别。您构建的Date对象表示您想要的正确日期和时间。
Date.toString()
方法基本上只是一个在格式化中使用JRE默认TimeZone的格式化程序。如果要测试Date对象是否正确,那么您应该构建一个java.util.Date
对象(使用java.util.Calendar
- 大多数Date构造函数已被弃用)以进行测试。如果要创建显示字符串,则应使用已创建的SimpleDateFormatter
实例来格式化Date对象。
如果确实需要存储TimeZone信息的对象,则应使用java.util.Calendar
。 java.util.Date
几乎已被弃用,无论如何都无法使用。或者,像我一样做,并等待Java 8中出现的新数据和时间API。
答案 1 :(得分:1)
.toString()
方法在打印日期时使用您的区域设置。
使用:
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy");
format.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(format.format(date));
答案 2 :(得分:0)
我知道BST已在SE 7中弃用。
答案 3 :(得分:0)
DateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy",
Locale.CANADA);
将本地参数添加到SimpleDateFormat
构造函数