我有一个日期转换器功能,例如:
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
我无法控制传递的日期,因为它是用户传递的。
如何使用相同的函数来解析两个日期?
答案 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}}对象。循环收集,尝试每个解析输入,直到没有引发解析异常。