Удалить год из LocalDate - Исключение: текст '20 -04 'не может быть проанализирован с индексом 0

Я делаю программу о зодиаке. По сути, он состоит из получения даты localDate , чтобы вернуть вам, каков ваш знак зодиака. Для этого у меня есть два класса, один из них типа enum , где я определяю каждый из знаков (принимая во внимание дату начала, дату окончания и элемент каждого знака: огонь, земля, воздух и вода ) и класс main , из которого я задаю вопросы этому классу.

Я включаю оба класса:

    //Prueba para ver si devuelve correctamente el nombre
    System.out.println("Nombre del signo:");
    System.out.println(Zodiac.AQUARIUS.name());
    System.out.println("");

    //Prueba para ver si devuelve correctamente el toString del signo solicitado 
    System.out.println("Información sobre el signo:");
    System.out.println(Zodiac.LEO.toString());
    System.out.println("");

    //Devuelve el elemento de cada signo
    System.out.println("Elemento del signo:");
    System.out.println(Zodiac.LEO.getElement());
    System.out.println("");

    //Devuelve la posición que guarda
    System.out.println("Posición que ocupa el signo:");
    System.out.println(Zodiac.SCORPIO.ordinal());
    System.out.println("");

    //Devuelve el signo de la fecha introducida
    System.out.println("Signo de fecha concreta:");
    System.out.println(Zodiac.getZodiac(LocalDate.of(2019, 4, 20)));
    System.out.println("");

Класс enum выглядит следующим образом:

ARIES (LocalDate.of(2019, 3 ,21), LocalDate.of(2019, 4 ,19), "Fire"),
TAURUS(LocalDate.of(2019, 4 ,20),LocalDate.of(2019, 5 ,20),"Earth"),
GEMINI(LocalDate.of(2019, 5 ,21),LocalDate.of(2019, 6 ,20),"Air"),
CANCER(LocalDate.of(2019, 6 ,21),LocalDate.of(2019, 7 ,22),"Water"),
LEO(LocalDate.of(2019, 7 ,23),LocalDate.of(2019, 8 ,22),"Fire"),
VIRGO(LocalDate.of(2019, 8 ,23),LocalDate.of(2019, 9 ,22),"Earth"),
LIBRA(LocalDate.of(2019, 9 ,23),LocalDate.of(2019, 10 ,22),"Air"),
SCORPIO(LocalDate.of(2019, 10 ,23),LocalDate.of(2019, 11 ,21),"Water"),
SAGITTARIUS(LocalDate.of(2019, 11 ,22),LocalDate.of(2019, 12 ,21),"Fire"),
CAPRICORN(LocalDate.of(2019, 12 ,22),LocalDate.of(2020, 1 ,19),"Earth"),
AQUARIUS(LocalDate.of(2020, 1 ,20),LocalDate.of(2020, 2 ,18),"Air"),
PISCES(LocalDate.of(2020, 2 ,19),LocalDate.of(2020, 3 ,20),"Water");


private  String element;
private  LocalDate begining = LocalDate.of(2019, 01 ,01); 
private  LocalDate ending = LocalDate.of(2019, 01 ,01);

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM");

private Zodiac(LocalDate begining, LocalDate ending, String element) {
            this.begining=begining;
            this.ending=ending;
            this.element=element;
}

public LocalDate getBegining() {
    return begining;
}

public LocalDate getEnding() {
    return ending;
}

public String getElement() {
    return element;
}

public static String getZodiac(LocalDate birthdate) throws Exception{

    LocalDate localDate = birthdate;
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM");
    String birthdateFormatted = localDate.format(formatter);

    if(LocalDate.parse(birthdateFormatted).isAfter(LocalDate.parse("20-03")) && LocalDate.parse(birthdateFormatted).isBefore(LocalDate.parse("20-04"))) {
        return ARIES.name();
    }
    if(LocalDate.parse(birthdateFormatted).isAfter(LocalDate.parse("19-04")) && LocalDate.parse(birthdateFormatted).isBefore(LocalDate.parse("21-05"))) {
        return TAURUS.name();
    }
    if(LocalDate.parse(birthdateFormatted).isAfter(LocalDate.parse("20-05")) && LocalDate.parse(birthdateFormatted).isBefore(LocalDate.parse("21-06"))) {
        return GEMINI.name();
    }
    if(LocalDate.parse(birthdateFormatted).isAfter(LocalDate.parse("20-06")) && LocalDate.parse(birthdateFormatted).isBefore(LocalDate.parse("23-07"))) {
        return CANCER.name();
    }
    if(LocalDate.parse(birthdateFormatted).isAfter(LocalDate.parse("22-07")) && LocalDate.parse(birthdateFormatted).isBefore(LocalDate.parse("23-08"))) {
        return LEO.name();
    }
    if(LocalDate.parse(birthdateFormatted).isAfter(LocalDate.parse("22-08")) && LocalDate.parse(birthdateFormatted).isBefore(LocalDate.parse("23-09"))) {
        return VIRGO.name();
    }
    if(LocalDate.parse(birthdateFormatted).isAfter(LocalDate.parse("22-09")) && LocalDate.parse(birthdateFormatted).isBefore(LocalDate.parse("23-10"))) {
        return LIBRA.name();
    }
    if(LocalDate.parse(birthdateFormatted).isAfter(LocalDate.parse("22-10")) && LocalDate.parse(birthdateFormatted).isBefore(LocalDate.parse("22-11"))) {
        return SCORPIO.name();
    }
    if(LocalDate.parse(birthdateFormatted).isAfter(LocalDate.parse("21-11")) && LocalDate.parse(birthdateFormatted).isBefore(LocalDate.parse("22-12"))) {
        return SAGITTARIUS.name();
    }
    if(LocalDate.parse(birthdateFormatted).isAfter(LocalDate.parse("21-12")) && LocalDate.parse(birthdateFormatted).isBefore(LocalDate.parse("20-01"))) {
        return CAPRICORN.name();
    }
    if(LocalDate.parse(birthdateFormatted).isAfter(LocalDate.parse("19-01")) && LocalDate.parse(birthdateFormatted).isBefore(LocalDate.parse("19-02"))) {
        return AQUARIUS.name();
    }
    if(LocalDate.parse(birthdateFormatted).isAfter(LocalDate.parse("18-02")) && LocalDate.parse(birthdateFormatted).isBefore(LocalDate.parse("21-03"))) {
        return PISCES.name();
    }
    else {
        throw new Exception("It has been impossible to obtain the zodiac sign for the date" + birthdate);
    }

}
@Override
public String toString() {
    return name()+ " ("+begining.format(formatter)+"-"+ending.format(formatter)+")"+" - "+ getElement();
}

Теперь при выполнении System.out. println (Zodiac.getZodiac (LocalDate.of (2019, 4, 20))); должен просто получить имя знака, соответствующего этой дате. Ну, я получаю следующее сообщение об исключении:

Exception in thread "main" java.time.format.DateTimeParseException: **Text '20-04' could not be parsed at index 0**
    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2049)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1951)
    at java.base/java.time.LocalDate.parse(LocalDate.java:428)
    at java.base/java.time.LocalDate.parse(LocalDate.java:413)
    at PAC2_ex4/PAC2_ex4.Zodiac.getZodiac(Zodiac.java:51)
    at PAC2_ex4/PAC2_ex4.Check.main(Check.java:33)

Как вы можете видеть, я должен сделать вызов метода getZodiac с localdate.of (2019,4,20) , поскольку это формат, поддерживаемый localdate. Что ж, мое намерение в рамках метода getZodiac состоит в том, чтобы придать ему формат ("dd-MM") , и для этого я использовал следующий код:

   LocalDate localDate = birthdate;
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM");
        String birthdateFormatted = localDate.format(formatter);

Чтобы потом можно было использовать - это после и - до с датами каждого зодиака. Примером может быть:

if(LocalDate.parse(birthdateFormatted).isAfter(LocalDate.parse("20-03")) && LocalDate.parse(birthdateFormatted).isBefore(LocalDate.parse("20-04"))) {
        return ARIES.name();
    }

Я не знаю, почему я пропускаю ошибку или что мне нужно изменить. Я был бы признателен, если бы вы могли протянуть мне руку помощи, поскольку я некоторое время занимался этой проблемой, и я не могу найти решение.

4
задан 20.11.2019, 18:51
1 ответ

В конце концов результат более легкий, чем все это. И дело в том, что ввиду того, что зодиак не меняется дат год через год, он не имеет значения для нас, что год мы властвовали. Но когда создайте каждый знак в enum , давайте верить в LocalDate.of (YYYY, ММ, DD) (я одну из даты инициализирую и другой датирует конец).

Ну вот, вместо того, чтобы играть с датой то, что мы сделаем в методе getZodiac будет следующее:

    public static Zodiac getZodiac(LocalDate date) {

    date = date.withYear(2019); 

    for(Zodiac zodiac : values()) {

        if ((zodiac.init.isBefore(date) || zodiac.init.isEqual(date))
                && (zodiac.end.isAfter(date) || zodiac.end.isEqual(date))) {
            return zodiac;
        }

    }

Я Схватил, поместив, например, что знак - 14 апреля 1984, этот метод проведет 1984 в 2019 и так сможет искать внутри enum созданных.

Надеялся, что кто-то может использовать это в какой-то день.

Приветствие!

-1
ответ дан 01.12.2019, 11:05
  • 1
    ¿ Не ты sirvió или какой-то из ответов помог сообщества? – Jorgesys♦ 27.11.2019, 20:06