如何将日期字符串解析为日期?

122

我该如何将下面的日期字符串解析为一个Date对象?

String target = "Thu Sep 28 20:29:30 JST 2000";
DateFormat df = new SimpleDateFormat("E MM dd kk:mm:ss z yyyy");
Date result =  df.parse(target);  

抛出异常...

java.text.ParseException: Unparseable date: "Thu Sep 28 20:29:30 JST 2000"
        at java.text.DateFormat.parse(DateFormat.java:337)

2
请注意,旧的日期时间类(例如java.util.Datejava.util.Calendarjava.text.SimpleTextFormat)现在已经成为遗留系统,被Java.time类所取代。请参阅Oracle的教程 - Basil Bourque
对于在2019年或之后访问此问题的任何人,我建议您不要使用SimpleDateFormatDate。这些类设计不佳且过时已久,前者尤其令人头疼。相反,请使用来自java.time,现代Java日期和时间APIZonedDateTimeDateTimeFormatter。我足够自大,推荐我的答案 - Ole V.V.
6个回答

177
模式是错误的。您使用了一个三个字母的日缩写,因此它必须是EEE。您使用了一个三个字母的月份缩写,因此它必须是MMM。由于这些日和月份缩写是区域设置敏感的,因此您需要明确指定SimpleDateFormat的区域设置为英语,否则它将使用平台默认的区域设置,这可能不是英语本身。
public static void main(String[] args) throws Exception {
    String target = "Thu Sep 28 20:29:30 JST 2000";
    DateFormat df = new SimpleDateFormat("EEE MMM dd kk:mm:ss z yyyy", Locale.ENGLISH);
    Date result =  df.parse(target);  
    System.out.println(result);
}

这里打印出来了

2000年9月28日 星期四 07:29:30 BOT(玻利维亚时间)

按照我的时区是正确的。

如果您不想使用kk,我建议您考虑使用HH。有关有效模式的详细信息,请参阅javadoc


不行,还是报同样的错误,我也试过用zzz了,但没有成功。我现在要检查文档,感谢提供链接。 - Meow
1
在这里运行良好(在您的第二个代码行中删除“String”后)。您的问题出在其他地方。 - BalusC
嗯,我会移除“string”,但是在我的本地还是无法工作,现在正在查看其他地方...有趣... - Meow
4
顺便问一下,这个日期字符串是从哪里来的?它看起来非常像 java.util.Date#toString() 方法的默认输出结果。你有没有做错什么事情?(把日期当作字符串而不是日期类型传递) - BalusC
3
这里的工作正常运行。它是真正有效的。你需要更清楚地解释那个“错误”。至于传递值,我更愿意使用固定和相同的模式进行格式化(在HTML中显示/编辑)和解析(处理请求参数)。例如:yyyy-MM-dd HH:mm:ss - BalusC
显示剩余4条评论

15

以下是一个可用的示例:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.util.Date;

public class j4496359 {
    public static void main(String[] args) {
        try {
            String target = "Thu Sep 28 20:29:30 JST 2000";
            DateFormat df = new SimpleDateFormat("EEE MMM dd kk:mm:ss zzz yyyy");
            Date result =  df.parse(target);
            System.out.println(result); 
        } catch (ParseException pe) {
            pe.printStackTrace();
        }
    }
}

将打印:

Thu Sep 28 13:29:30 CEST 2000

2
我已经尝试过了...它没有起作用 :( - Meow
我更新了我的帖子,并附上了经过测试的代码 ;) - miku
感谢您包含相关的导入。 - Carl Parker

13
String target = "27-09-1991 20:29:30";
DateFormat df = new SimpleDateFormat("dd MM yyyy HH:mm:ss");
Date result =  df.parse(target);
System.out.println(result); 

这个有效吗?


8
我理解你的意思是:“dd-MM-yyyy HH:mm:ss”。 - Sergio

7
new SimpleDateFormat("EEE MMM dd kk:mm:ss ZZZ yyyy");

and

new SimpleDateFormat("EEE MMM dd kk:mm:ss Z yyyy");

代码仍在运行。但是,如果您的代码抛出异常,那么可能是由于您的工具、jdk或其他原因造成的。因为我在IDE中遇到了同样的错误,请检查这些http://ideone.com/Y2cRr(在线IDE)与ZZZZ

输出结果为:Thu Sep 28 11:29:30 GMT 2000


你说得对,我的IDE是NetBean3.9,运行完全相同的代码时会出错,而在线IDE则不会。 - Meow
我也遇到过同样的问题。我知道这种感觉 :) 代码是正确的,但输出却错误。更新你的JDK,就不会有任何问题了。 - user467871

4

我曾经遇到过这个问题,后来我将 Locale 设置为 US,然后它就正常工作了。

static DateFormat visitTimeFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy",Locale.US);

对于String "Sun Jul 08 00:06:30 UTC 2012"


我不得不为新的SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.US)设置Locale.US,以便解析"Wed Jan 25 11:13:11 +0100 2012"。 - OneWorld

0

解析异常是一个已检查的异常,因此在将字符串解析为日期时,必须使用try-catch捕获它,就像@miku建议的那样...


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