Java 正在分析到目前为止的特定字符串

Java 正在分析到目前为止的特定字符串,java,date,parsing,Java,Date,Parsing,在通过Selenium读取整个表并将结果写入excel文件的过程中,我目前面临着格式化/解析日期对象中的日期字符串的问题。我要归档的是以下格式: dd-mm-yyyy 从表中检索的日期字符串如下所示 2020年4月16日 我试图使用SimpleDateFormat格式化程序,但得到了ParseException java.text.ParseException: Unparseable date: "16 Apr 2020" 执行以下操作 Date date = new Simp

在通过Selenium读取整个表并将结果写入excel文件的过程中,我目前面临着格式化/解析
日期
对象中的日期
字符串
的问题。我要归档的是以下格式:

dd-mm-yyyy
从表中检索的日期字符串如下所示

2020年4月16日
我试图使用
SimpleDateFormat
格式化程序,但得到了
ParseException

java.text.ParseException: Unparseable date: "16 Apr 2020"
执行以下操作

     Date date = new SimpleDateFormat("dd MMM yyyy").parse("16 aug 2020");
     System.out.println(date);
输出 2020年8月16日星期日00:00:00 PDT

出现错误的原因是
dd-mm-yyyy
与“2020年8月16日”不匹配
后面没有连字符,月份有三个字母,mm只代表两个,
dd-mm-yyyy
是一种正则表达式,它应该与要解析的字符串相匹配

仅用于记录:这是如何使用
java.time
解析和格式化当前的日期
字符串
(可从java 8获得):

这个的输出是

16-04-2020

您是如何尝试的?你能把密码寄出去吗?提示:您想要的格式有缺陷
m
表示分钟,
m
表示月。您是否必须使用
SimpleDateFormat
Date
,或者您是否可以决定采用称为
java.time
的不太麻烦的方式,您使用的日期时间类很糟糕,多年前被JSR 310中定义的现代java.time类所取代。我认为它应该是三个M。
新的SimpleDataFormat(“dd-MMM-yyyy”)
您说得对,谢谢,我用2个M测试它,然后忘了放回去,顺便说一句,2个M的正确答案中有pasing错误,但是我认为我们不应该帮助人们使用早已过时且臭名昭著的SimpleDataFormat类。至少不是第一个选择。而且不是毫无保留的。今天,我们在及其
DateTimeFormatter
@OleV.V中有了更好的功能。同意,但我不知道他是否有Java8,我是他的助手,他可能已经知道,他应该在他的电脑上学习时间包own@Eltomon,仅供参考,如果日期不正确,则不会失败。例如,
2020年4月31日
将打印
2020年4月30日
。如果使用
SimpleDataFormat
,则将打印与
01-May-2020
@OleV.V相同的值。是的,谢谢。。。在用于解析的格式化程序中使用
Locale
更好。
public static void main(String[] args) {
    // the date String
    String dateString = "16 Apr 2020";
    /*
     * which is parsed to a LocalDate using a formatter 
     * with a suitable pattern and a fitting Locale
     * (ENGLISH is a good choice because it is language specific,
     * you could use a country specific one here as well, like US or UK)
     */
    LocalDate ld = LocalDate.parse(dateString,
            DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.ENGLISH));
    /*
     * and which is then printed in a different format 
     * using a formatter with a different pattern
     * (this time no Locale is needed because the format is numeric)
     */
    System.out.println(ld.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")));
}