Java不可解析日期简化格式

Java不可解析日期简化格式,java,simpledateformat,Java,Simpledateformat,我有一个约会,看起来是这样的: Sun Dec 29 00:24:09 CET 2019 我有一个将字符串日期从一种格式解析为另一种格式的实用方法: public String formatDate(String date, String fromFormat, String toFormat) throws Exception { SimpleDateFormat from = new SimpleDateFormat(fromFormat); SimpleD

我有一个约会,看起来是这样的:

Sun Dec 29 00:24:09 CET 2019
我有一个将字符串日期从一种格式解析为另一种格式的实用方法:

public String formatDate(String date, String fromFormat, String toFormat) throws Exception {
        SimpleDateFormat from = new SimpleDateFormat(fromFormat);
        SimpleDateFormat to = new SimpleDateFormat(toFormat);
        return to.format(from.parse(date));
    }
但是,对于上述日期格式,我找不到正确的日期模式来指示我的方法。 根据,它应该是(如果我没有弄错的话)以下内容(对于2019年欧洲中部时间12月29日00:24:09):

但是,它会引发以下异常:

java.text.ParseException: Unparseable date: "Sun Dec 29 00:24:09 CET 2019"
        at java.text.DateFormat.parse(DateFormat.java:366)
        at com.aptar.simulator.Utils.formatDate(Utils.java:60)
该方法的调用方式如下:

formatDate(exDate, "E M d HH:mm:ss z yyyy", "dd-MM-yyyy HH:mm:ss");
在哪里

exDate = "Sun Dec 29 00:24:09 CET 2019"
日期格式应为

EEE MMM dd HH:mm:ss z yyyy

使用此格式,您的代码工作正常

使用
java.time
API

LocalDate.parse(datestr, DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z yyyy")).format("TO DATE PATTERN");
有关详细信息,请参见下面的解决方案-

formatDate("Sun Dec 29 00:24:09 CET 2019","EEE MMM d HH:mm:ss z yyyy","dd-MM-yyyy HH:mm:ss");
格式应为-“EEE MMM d HH:mm:ss z yyyy”

您应该对Sun使用
EEE
,对Dec使用
MMM


希望这有帮助。

请查找下面的代码片段以解决您的问题。问题是字母代码正确,但字符计数不匹配,因此导致问题。例如:Sun有三个字符,但您在格式化程序中使用了一个E

public class Examp167 {
    public static String formatDate(String date, String fromFormat, String toFormat) throws Exception {
        SimpleDateFormat from = new SimpleDateFormat(fromFormat);
        SimpleDateFormat to = new SimpleDateFormat(toFormat);
        return to.format(from.parse(date));
    }
    public static void main(String[] args) throws Exception{
        String exDate  = "Sun Dec 29 00:24:09 CET 2019";
       System.out.println( formatDate(exDate, "EEE MMM dd HH:mm:ss zzz yyyy", "dd-MM-yyyy HH:mm:ss"));
    }
} 

首先使用
DateTimeFormatter
而不是旧的过时类,然后您应该设置区域设置,因为日期和月份名称是英文的,最后一个in格式需要是MMM而不是M

public static String formatDate(String date, String fromFormat, String toFormat) throws Exception {
    DateTimeFormatter inFormatter = DateTimeFormatter.ofPattern(fromFormat, Locale.US);

    DateTimeFormatter outFormatter = DateTimeFormatter.ofPattern(toFormat, Locale.US);
    return outFormatter.format(inFormatter.parse(date));
}
例如:

String exDate = "Sun Dec 29 00:24:09 CET 2019";
String out = formatDate(exDate, "E MMM d HH:mm:ss z yyyy", "dd-MM-yyyy HH:mm:ss");
System.out.println(out);
29-12-2019 00:24:09


被接受为指出Java.time的答案。(项目中的另一个问题:D)我建议您不要使用
SimpleDateFormat
Date
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。而是使用
ZonedDateTime
DateTimeFormatter
,这两种方法都来自于您的示例,我可以用自己的方法完成它,但它实际上既不是完全最小的,也不是完全可复制的。请重新阅读。
E
可以作为星期几的缩写,但月份可以是数字或文本。因此,
M
MM
用一位或两位数字表示月份号。对于月缩写,如
Dec
你需要三个字母:
MMM
。显然是我最喜欢的答案。建议使用java.time,这是解释错误原因的唯一答案,也是唯一指出需要使用区域设置的答案。
String exDate = "Sun Dec 29 00:24:09 CET 2019";
String out = formatDate(exDate, "E MMM d HH:mm:ss z yyyy", "dd-MM-yyyy HH:mm:ss");
System.out.println(out);