1

我正在尝试解析日期字符串,但收到此错误:

java.text.ParseException:无法解析的日期:“1997 年 10 月 1 日,上午 12:00:00”

这是我用来解析的方法Date

public static Date parse(@NonNull String dateString, @NonNull String dateFormat) {
    val sdf = new SimpleDateFormat(dateFormat);
    sdf.setLenient(false);
    try {
        return sdf.parse(dateString);
    } catch (ParseException e) {
        return null;
    }
}

在哪里dateStringOct 1, 1997, 12:00:00 AMdateFormatMMM d, yyyy, HH:mm:ss a

为什么无法解析日期?

4

3 回答 3

3

我猜你应该使用“h”而不是“H”。小写 h 表示 0-12 大写 1 表示 0-24。总的来说应该是 MMM d, yyyy, hh:mm:ss a

于 2020-07-27T11:59:11.467 回答
3

如果将 SimpleDateFormat 更改为 DateTimeFormatter,则异常会显示错误:

Caused by: java.time.DateTimeException: Conflict found: Field AmPmOfDay 1 differs from AmPmOfDay 0 derived from 12:00

对于 12:00 时间,它预计是 PM。如果您指的是午夜,则应该是 00:00 AM。

于 2020-07-27T12:08:38.340 回答
2

您的代码抛出异常,因为字符串 Date 对于字符串模式无效,请在此处查看文档

具体来说,如果小时的格式在 0-23 之间,则字符串为HH,但如果您使用 1-12 AM, PM 那么您必须使用hh

这是一些参考代码:

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Date x = parse("Oct 1, 1997, 12:00:00 AM", "MMM d, yyyy, hh:mm:ss a");
        System.out.println("X String: " + x); 
    }
    
    public static Date parse(String dateString, String dateFormat) {
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        sdf.setLenient(false);
        try {
            return sdf.parse(dateString);
        } catch (Exception e) {
            System.out.println("E???");
            return null;
        }
    }
}

如果您需要编辑,这里是ideone代码:

https://ideone.com/ccwo2Y

于 2020-07-27T12:15:37.040 回答