java.text.ParseException:无法解析的日期:“ 2020年3月11日”

时间:2020-03-12 05:46:33

标签: java date

从请求中收到的完整日期是这种格式

Wed Mar 11 2020 05:29:01 GMT+0100 (West Africa Standard Time)

现在我将其分类为-2020年3月11日星期三

date.substring(0,15))

为了使我能够保存日期,我将其解析如下

SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd", Locale.ENGLISH);
Date parsedDate = null;
try {
    parsedDate = format.parse(date);
} catch (ParseException e) {
    e.printStackTrace();
}

运行代码后,出现以下错误

java.text.ParseException: Unparseable date: "Wed Mar 11 2020"

我也尝试过使用

进行解析
SimpleDateFormat format = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy",
                Locale.ENGLISH);

基于SO答案,我仍然遇到日期解析错误。

如何解析此日期- date.substring(0,15))

4 个答案:

答案 0 :(得分:1)

您需要与日期匹配的formatEEE MMM dd yyyy,例如

String date = "Wed Mar 11 2020 05:29:01 GMT+0100 (West Africa Standard Time)";
date = date.substring(0,15);
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd yyyy");
Date parsedDate = null;
try {
    parsedDate = format.parse(date);
} catch (Exception e) {
    e.printStackTrace();
}     
System.out.println(parsedDate);
SimpleDateFormat outformat = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(outformat.format(parsedDate));

输出:

Wed Mar 11 00:00:00 CET 2020
2020-03-11

答案 1 :(得分:1)

三点:

  1. 在您的日期和时间工作中,请使用现代的Java日期和时间API java.time。
  2. 我不想解析收到的字符串的子字符串,而是希望解析整个字符串。
  3. 您的格式模式字符串必须与您要解析的字符串匹配(反之亦然)。没错。

在代码中:

DateTimeFormatter formatter = 
        DateTimeFormatter.ofPattern(
            "EEE MMM d uuuu HH:mm:ss 'GMT'xx (zzzz)",  // Pattern to match your input strings.
            Locale.UK                                  // Locale determines human language used to parse name of month and such.
        )
;
String dateString = "Wed Mar 11 2020 05:29:01 GMT+0100 (West Africa Standard Time)";
ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateString, formatter);

生成一个字符串。

System.out.println( zonedDateTime.toString() );

此代码段的输出为:

2020-03-11T03:29:01 + 01:00 [非洲/拉各斯]

使用java.time。现代化的API更易于使用。您使用的Date类的设计很差,并且SimpleDateFormat非常麻烦。请勿使用其中任何一个。

解析整个字符串。使用长度为15的子字符串将使您的代码的某些读者感到疑惑,有的问“ WTF?”,有的则利用宝贵的时间进行计数以确保15是正确的长度。另外,如果长度为15的子字符串很脆弱,除非您确定星期几和月份的缩写的长度始终为3,并且星期几的缩写始终用两位数字书写(5月2日,而不是5月2日)。此外,解析多于您所需的信息并在以后丢弃信息要比仅解析您认为需要的信息,然后发现需要多一点信息更容易。

指定格式。由于您的字符串以星期几缩写开头,因此您需要一个以星期几的格式模式字母开头的格式模式字符串。在这种情况下,EEE(或EEE)的缩写(EEEE表示当天写满的日期,例如星期三 。因此YYYY-MM-dd都是错误的。 EE MMM dd HH:mm:ss z yyyy更近,可以解析星期几,月份和每月的某天。然后在输入中输入空格和年份,但是格式模式字符串的结尾处是yyyy,因此,解析为您带来了麻烦。如果编写正确的格式模式字符串(多数情况下如此),一个窍门是尝试一些操作,然后首先使用格式化程序对日期和时间进行格式化。如果结果与我们要解析的字符串不同,通常可以提示我们出了什么问题。

链接: Oracle tutorial: Date Time解释了如何使用java.time。

答案 2 :(得分:0)

尝试一下。

    SimpleDateFormat sdf3 = new SimpleDateFormat("EEE MMM dd yyyy");
    Date d1 = null;
    try {
        d1 = sdf3.parse("Wed Mar 30 2016");
    } catch (Exception e) {
        e.printStackTrace();
    }

    System.out.println(sdf3.format(d1));

}

输出:

Wed Mar 30 2016

答案 3 :(得分:0)

首先,您需要控制计算机语言。根据您计算机的语言。您必须用计算机的语言写出日期名称和月份名称

实际上,您最好根据您的语言来转换此“星期三”。

我的计算机的语言是土耳其语。 我在下面的代码中使用了如何在Java上的日期上使用日期名称。

public static void main(String[] args) { 
    String sDate1 = "Per Mar-11-2020";  
    String sDate2 = "Perşembe Mar-11-2020";  
    Date date1;
    try {
        date1 = new SimpleDateFormat("EEE MMM-dd-yyyy").parse(sDate1);
        System.out.println(sDate1+"\t\t"+date1);
        date1 = new SimpleDateFormat("EEEEE MMM-dd-yyyy").parse(sDate2);
        System.out.println(sDate2+"\t\t"+date1);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       
}

输出:

Per Mar-11-2020     Wed Mar 11 00:00:00 AST 2020
Perşembe Mar-11-2020        Wed Mar 11 00:00:00 AST 2020

还需要格外小心,例如:

如果您的字符串为 2020年3月11日,则需要编写 EEE MMM-dd-yyyy

如果您的字符串为 2020年3月11日,则需要编写 EEE MMM dd yyyy

如果您的字符串为 2020年3月11日,则需要编写 EEE MMM / dd / yyyy

相关问题