用Java格式化日期

时间:2014-01-10 01:44:12

标签: java date datetime timestamp

我遇到使用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但无济于事。

4 个答案:

答案 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.Calendarjava.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构造函数