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);