为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

FFIVE 2022-07-20 20:23:03
我有一个日期转换器功能,如: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 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

了解你的字符串

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


查看完整回答
反对 回复 2022-07-20
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

我认为更好的解决方案是覆盖类中的方法。



查看完整回答
反对 回复 2022-07-20
?
侃侃无极

TA贡献2051条经验 获得超10个赞

两个格式化程序

如果您希望传入字符串中有两种格式中的任何一种,请建立两个DateTimeFormatter对象,每个对象对应一种预期格式。

尝试两者

尝试一种格式化程序,为DateTimeParseException. 如果抛出,尝试另一个。如果第二个也抛出,那么您知道您收到了意外的错误输入。

如果您有两种以上的预期格式,请收集所有可能的DateTimeFormatter对象。循环集合,尝试每一个解析输入,直到不抛出解析异常。


查看完整回答
反对 回复 2022-07-20
  • 3 回答
  • 0 关注
  • 108 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信