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
TA贡献2051条经验 获得超10个赞
两个格式化程序
如果您希望传入字符串中有两种格式中的任何一种,请建立两个DateTimeFormatter
对象,每个对象对应一种预期格式。
尝试两者
尝试一种格式化程序,为DateTimeParseException
. 如果抛出,尝试另一个。如果第二个也抛出,那么您知道您收到了意外的错误输入。
如果您有两种以上的预期格式,请收集所有可能的DateTimeFormatter
对象。循环集合,尝试每一个解析输入,直到不抛出解析异常。
添加回答
举报