tema de análisis de la fecha con el árabe y la fecha regular en Java

Robin :

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?

VV Ole:

Conocer la cadena de

DateTimeFormatterno 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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=180263&siteId=1
Recomendado
Clasificación