问题描述
String str="Sun Feb 07 00:27:16 CET 2021";
SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy");
try {
java.util.Date date=sdf.parse(str);
System.out.print(date.getTime());
} catch (ParseException ex) {
Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE,null,ex);
}
它显示 坟墓:空 java.text.ParseException:无法解析的日期:“Sun Feb 07 00:27:16 CET 2021” 请问如何解决!
解决方法
您的代码有两个问题:
- 未使用正确的格式:您使用了
E
而不是EEE
- 不使用
Locale
:养成使用适用的Locale
和日期时间解析/格式化 API 的习惯。您的日期时间字符串在English
中,因此您应该使用英语特定的语言环境,例如Locale.ENGLISH
、Locale.US
等
正确的代码:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
public class Main {
public static void main(String[] args) throws ParseException {
String str = "Sun Feb 07 00:27:16 CET 2021";
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",Locale.ENGLISH);
java.util.Date date = sdf.parse(str);
System.out.print(date.getTime());
}
}
输出:
1612654036000
java.util
的日期时间 API 及其格式化 API SimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到 modern date-time API。
- 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7。
- 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。
使用现代日期时间 API:
import java.text.ParseException;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) throws ParseException {
String str = "Sun Feb 07 00:27:16 CET 2021";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z uuuu",Locale.ENGLISH);
ZonedDateTime zdt = ZonedDateTime.parse(str,dtf);
System.out.println(zdt);
System.out.println(zdt.toInstant().toEpochMilli());
}
}
输出:
2021-02-07T00:27:16+01:00[Europe/Paris]
1612654036000
从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。