Tengo una función de conversión como la fecha:
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;
}
Funciona bien para las fechas árabes como ٢٠١٩-٠٤-١٥
, pero al pasar un día normal como 2019-07-31
, lanza una excepción porque el formateador es de un tipo diferente:
Exception in thread "main" java.time.format.DateTimeParseException: Text '2019-07-31' could not be parsed at index 0
No tengo control sobre la fecha pasada, ya que se pasa por el usuario.
¿Cómo puedo usar la misma función para analizar ambas fechas?
Conocer la cadena de
DateTimeFormatter
no hacer esto más fácil para usted. Estoy especulando que puede haber un propósito detrás de esta elección: es mejor si usted puede traer a sí mismo en una situación en la que sabe de antemano qué tipo de dígitos se utiliza en la cadena que se va a analizar. Usted puede dar a este un pensamiento: se puede convencer a la fuente de la cadena de pasar esta información a usted?
Tome un sabor y actuar en consecuencia
Si no es así, por supuesto, hay un camino a través. El siguiente es de bajo nivel, pero debe ser general.
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;
}
Vamos a tratar de usted mismo:
System.out.println("Parsing Arabic date string to "
+ getLocalDateFromString("٢٠١٩-٠٤-١٥"));
System.out.println("Parsing Western date string to "
+ getLocalDateFromString("2019-07-31"));
La salida de este fragmento es:
Parsing Arabic date string to 2019-04-15 Parsing Western date string to 2019-07-31