如何在Java中将格式化字符串解析为日期对象

6
在Java中,如何将"Wed, 05 Jun 2013 00:48:12 GMT"解析为日期对象,并以相同的格式打印日期对象。我尝试了以下代码:
String dStr= "Wed, 05 Jun 2013 00:48:12 GMT"; 
SimpleDateFormat ft =  new SimpleDateFormat ("E, dd MMM yyyy hh:mm:ss ZZZ"); 
Date t = ft.parse(dStr); 
System.out.println(t); 
System.out.println(ft.format(t));

结果是
Wed Jun 05 10:48:12 EST 2013
Wed, 05 Jun 2013 10:48:12 +1000 

非常感谢你的提前帮助:


这是否真的会产生10小时的差异,还是那段文本被糟糕地复制了? - Martijn Courteaux
@MartijnCourteaux 不,它似乎只是在本地时区输出。 - Mattias Buelens
啊,现在我明白了 :) 我把+100和+1000搞混了。这仍然是一个小时... - Martijn Courteaux
System.out.println("2013年6月5日 星期三 00:48:12 GMT"); - DannyMo
4个回答

4
您没有错误,Wed, 05 Jun 2013 00:48:12 GMTWed, 05 Jun 2013 00:48:12 GMT都代表同一时间,第一个是格林威治标准时间(GMT),第二个是澳大利亚(东部标准时间EST)的相同时间,您只需要正确配置您的时区即可。
如果您想以GMT打印相同日期,请将此行代码添加到您的代码中。
ft.setTimeZone(TimeZone.getTimeZone("GMT"));

现在,如果您希望日期打印出的时区为"GMT"而不是"+0000",请按照@HewWolff的回答(使用zzz而不是ZZZ)进行操作。


问题是:OP想要输出使用原始输入字符串的时区,还是使用固定时区(如GMT)?我猜测setTimeZone可能是解决方案的一部分,但首先我们需要知道确切的问题。 - Mattias Buelens
@Mattias Buelens,我打算在一个固定的时区(如GMT)输出原始输入字符串,这里应该使用什么日期和时间模式呢?预期结果应该与“Wed, 05 Jun 2013 00:48:12 GMT”相同。谢谢。 - user1304846
@user1304846 可以同时使用 Hew Wolff 的答案(打印 GMT)和我的答案(将时区设置为 GMT)。 - morgano
@morgano,感谢您的建议。我使用了Clocks提供的代码,并在他的代码中将“z”替换为“zzz”,结果是“Wed, 05 Jun 2013 12:48:12 GMT”,与输入字符串“Wed, 05 Jun 2013 00:48:12 GMT”不同。这里还有什么进一步的建议吗? - user1304846
1
@user1304846 使用HH代替hh来表示24小时制。Clocks也在他自己的答案中指出了这一点。 - Mattias Buelens
谢谢大家,时钟确实提供了正确的解决方案并指出了我的错误。再次感谢你们所有人。 - user1304846

1
这解决了您的问题:

import java.text.*;
import java.util.*;

public class DateIt{
    public static void main(String [] args) throws Exception{
        String dStr= "Wed, 05 Jun 2013 00:48:12 GMT"; 
        SimpleDateFormat ft =  new SimpleDateFormat ("E, dd MMM yyyy HH:mm:ss z"); 
        Date t = ft.parse(dStr); 
        TimeZone gmt = TimeZone.getTimeZone("England/London");
        ft.setTimeZone(gmt);
        System.out.println(t); 
        System.out.println(ft.format(t));
        }
}

感谢您的代码,但是结果是“2013年6月5日星期三12:48:12 GMT”,与输入字符串“2013年6月5日星期三00:48:12 GMT”不同。这里还有什么建议吗? - user1304846
第7行是否有“HH”而不是“hh”? “HH”将以24小时制返回时间。 - Clocks
你是对的,我之前使用了“hh”,但是当我改成“HH”后,一切都正常了。非常感谢。 - user1304846

1

看起来你想要使用 zzz 而不是 ZZZ。这应该能帮助你将时区读写为代码而不是数字。


0

啊,我以前遇到过这个问题。

SimpleDateFormat.parse(String) 方法(我猜测)使用了一个 Calendar 实例。这有两个原因:

  1. 你不知道你正在处理哪种类型的日历(公历?玛雅历?素食主义者?)。
  2. Calendar 使用默认值初始化其字段,而你不一定希望设置这些默认值。当 SimpleDateFormat 调用它创建的 Calendar 实例的 getTime() 方法返回一个 Date 时,该 Date 将具有默认字段值,这些值并不由你提交的字符串所指示。

这些默认值会影响到调用 ft.format(t) 的结果。我发现解决这个问题的唯一方法是直接使用 Calendar 类(顺便说一句,这完全不容易)。等我有更多时间时,我会尝试提供一个代码示例。与此同时,请查看 javafx.util.converter.DateStringConverter


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