Fecha de análisis en mayúsculas a LocalDate

user1170330:

Estoy tratando de analizar la cadena FEBRUARY 2019en una LocalDate.

Este es mi enfoque:

LocalDate month = LocalDate.parse("FEBRUARY 2019", DateTimeFormatter.ofPattern("MMMM yyyy"));

O, alternativamente, establecer el Locale.US:

LocalDate month = LocalDate.parse("FEBRUARY 2019", DateTimeFormatter.ofPattern("MMMM yyyy", Locale.US));

Pero todo lo que consigo es la siguiente excepción:

Exception in thread "main" java.time.format.DateTimeParseException: Text 'FEBRUARY 2019' could not be parsed at index 0
Jon Skeet:

En primer lugar, me gustaría sugerir que la entrada que tienes no es una fecha - es un año y mes. Así que analizar a una YearMonth, y luego crear una LocalDatea partir de que lo que le apetezca. Me resulta más sencilla para que el texto código de manejo única frente a la manipulación de texto y realizar otras conversiones por separado cuando se está en el dominio de fecha / hora ya.

Para manejar el tema de mayúsculas y minúsculas, puede crear una DateTimeFormattercon el análisis de mayúsculas y minúsculas. Aquí está un ejemplo completo de lo siguiente:

import java.time.*;
import java.time.format.*;
import java.util.*;

public class Test {
    public static void main(String[] args) {
        // Note: this would probably be a field somewhere so you don't need
        // to build it every time.
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("MMMM yyyy")
            .toFormatter(Locale.US);

        YearMonth month = YearMonth.parse("FEBRUARY 2019", formatter);
        System.out.println(month);
    }
}

Como un enfoque alternativo que podría ser de utilidad si tiene una representación diferente, se podría construir un mapa y pasar eso a DateTimeFormatterBuilder.appendText. (Sólo he encontrado esto cuando alguna manera torpe sobre el código.)

import java.time.*;
import java.time.format.*;
import java.time.temporal.*;
import java.util.*;

public class Test {
    public static void main(String[] args) {
        // TODO: Build this map up programmatically instead?            
        Map<Long, String> monthNames = new HashMap<>();
        monthNames.put(1L, "JANUARY");
        monthNames.put(2L, "FEBRUARY");
        monthNames.put(3L, "MARCH");
        monthNames.put(4L, "APRIL");
        monthNames.put(5L, "MAY");
        monthNames.put(6L, "JUNE");
        monthNames.put(7L, "JULY");
        monthNames.put(8L, "AUGUST");
        monthNames.put(9L, "SEPTEMBER");
        monthNames.put(10L, "OCTOBER");
        monthNames.put(11L, "NOVEMBER");
        monthNames.put(12L, "DECEMBER");

        // Note: this would probably be a field somewhere so you don't need
        // to build it every time.
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendText(ChronoField.MONTH_OF_YEAR, monthNames)
            .appendLiteral(' ')
            .appendPattern("yyyy")
            .toFormatter(Locale.US);

        YearMonth month = YearMonth.parse("FEBRUARY 2019", formatter);
        System.out.println(month);
    }
}

Supongo que te gusta

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