Java中阿拉伯语和常规日期的日期解析问题

时间:2019-03-06 07:16:20

标签: java date

我有一个日期转换器功能,例如:

public static LocalDate getLocalDateFromString(String dateString) {
    DecimalStyle defaultDecimalStyle = DateTimeFormatter.ISO_LOCAL_DATE.getDecimalStyle();
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE.withDecimalStyle(defaultDecimalStyle.withZeroDigit('\u0660'));
    LocalDate date = LocalDate.parse(dateString, dateTimeFormatter);
    return date;
}

它对于٢٠١٩-٠٤-١٥之类的阿拉伯日期也能很好地工作,但是当我传递诸如2019-07-31之类的正常日期时,它会抛出异常,因为格式化程序的类型不同:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2019-07-31' could not be parsed at index 0

我无法控制传递的日期,因为它是用户传递的。

如何使用相同的函数来解析两个日期?

3 个答案:

答案 0 :(得分:4)

了解您的字符串

DateTimeFormatter对您来说并不容易。我推测这种选择可能有其目的:最好让您自己进入一种情况,即您事先知道要解析的字符串中使用了哪种数字。您可能会想到:可以说服字符串源将此信息传递给您吗?

品尝并采取相应行动

如果没有,当然有办法解决。以下是低级内容,但应该是一般性内容。

public static LocalDate getLocalDateFromString(String dateString) {
    DateTimeFormatter dateFormatter = DateTimeFormatter.ISO_LOCAL_DATE;
    // Take a digit from dateString to determine which digits are used
    char sampleDigit = dateString.charAt(0);
    if (Character.isDigit(sampleDigit)) {
        // Subtract the numeric value of the digit to find the zero digit in the same digit block
        char zeroDigit = (char) (sampleDigit - Character.getNumericValue(sampleDigit));
        assert Character.isDigit(zeroDigit) : zeroDigit;
        assert Character.getNumericValue(zeroDigit) == 0 : zeroDigit;
        DecimalStyle defaultDecimalStyle = dateFormatter.getDecimalStyle();
        dateFormatter = dateFormatter
                .withDecimalStyle(defaultDecimalStyle.withZeroDigit(zeroDigit));
    }
    // If the examined char wasn’t a digit, the following parsing will fail;
    // but in that case the best we can give the caller is the exception from that failed parsing.
    LocalDate date = LocalDate.parse(dateString, dateFormatter);
    return date;
}

让我们尝试一下:

    System.out.println("Parsing Arabic date string to  "
            + getLocalDateFromString("٢٠١٩-٠٤-١٥"));
    System.out.println("Parsing Western date string to "
            + getLocalDateFromString("2019-07-31"));

此代码段的输出为:

Parsing Arabic date string to  2019-04-15
Parsing Western date string to 2019-07-31

答案 1 :(得分:0)

我认为一个更好的解决方案是重写类中的方法。

答案 2 :(得分:0)

两个格式化程序

如果期望传入字符串中使用两种格式中的任何一种,请建立两个DateTimeParseException对象,每种期望格式中的一个。

同时尝试

尝试一个格式化程序,捕获DateTimeFormatter。如果抛出,请尝试其他方法。如果第二秒也抛出,则表明您收到了意外的错误输入。

如果期望的格式超过两种,请收集所有可能的{{1}}对象。循环收集,尝试每个解析输入,直到没有引发解析异常。