Котлин DateTimeParseException

Получение даты с https://api.spacexdata.com/v3/launches Эта дата имеет формат: 2006-03-25T10:30:00+12:00. Я хочу преобразовать его в «дд, мм, гггг», но всегда получаю сообщение об ошибке: «java.time.format.DateTimeParseException: текст '2006-03-25T10:30:00+12:00' не может быть проанализирован, не проанализированный текст найдено по индексу 10"

мой код:

      val formatter = DateTimeFormatter.ofPattern("dd, mm, yyyy", Locale.US)
val myDate = LocalDate.parse(launchDate, formatter)

var launchDateConverted: String=  myDate.toString()

я получаю данные в String, затем я конвертирую их в дату для форматирования, и после того, как я конвертирую дату обратно в строку, которая отображается в пользовательском интерфейсе. я использовал разные методы, но не могу найти правильный путь. Моя текущая локаль "RU".

2 ответа

Вам не нужен форматтер для анализа вашей входной строки

Вы вводите строку, 2006-03-25T10:30:00+12:00уже находится в формате по умолчанию, используемомOffsetDateTime#parseи, следовательно, вам не нужно явно использовать средство форматирования для анализа входной строки даты и времени.

указывает минуту , а указывает месяц

Вы неправильно использовали mдля месяца, для которого символ M. Посетите страницу документации, чтобы узнать больше об этих символах.

предпочитаю

указывает год эры (эра указывается как или ) и всегда является положительным числом, тогда как указывает год , который является числом со знаком (+/-). Обычно мы не используем +знак для записи положительного числа, но мы всегда указываем отрицательное число с -знак. То же правило действует в течение года . Пока вы собираетесь использовать год эры, AD(что чаще всего бывает), оба, yа также uдаст вам тот же номер. Однако разница возникает, когда вы используете год эры, BCнапример, год эры , 1 BCуказывается как год , 0; год эры , 2 BCуказывается как год , -1и так далее. Вы можете лучше понять это с помощью следующей демонстрации:

      import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Testing {
    public static void main(String[] args) {
        System.out.println(LocalDate.of(-1, 1, 1).format(DateTimeFormatter.ofPattern("u M d")));
        System.out.println(LocalDate.of(-1, 1, 1).format(DateTimeFormatter.ofPattern("y M d")));
        System.out.println(LocalDate.of(-1, 1, 1).format(DateTimeFormatter.ofPattern("yG M d")));

        System.out.println();

        System.out.println(LocalDate.of(0, 1, 1).format(DateTimeFormatter.ofPattern("u M d")));
        System.out.println(LocalDate.of(0, 1, 1).format(DateTimeFormatter.ofPattern("y M d")));
        System.out.println(LocalDate.of(0, 1, 1).format(DateTimeFormatter.ofPattern("yG M d")));

        System.out.println();

        System.out.println(LocalDate.of(1, 1, 1).format(DateTimeFormatter.ofPattern("u M d")));
        System.out.println(LocalDate.of(1, 1, 1).format(DateTimeFormatter.ofPattern("y M d")));
        System.out.println(LocalDate.of(1, 1, 1).format(DateTimeFormatter.ofPattern("yG M d")));
    }
}

Выход:

      -1 1 1
2 1 1
2BC 1 1

0 1 1
1 1 1
1BC 1 1

1 1 1
1 1 1
1AD 1 1

Примечание. Я использовал Java для демонстрации решения, но оно также будет работать в Kotlin.

Окончательное решение:

      import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        OffsetDateTime odt = OffsetDateTime.parse("2006-03-25T10:30:00+12:00");
        System.out.println(odt);

        // Format it into the desired pattern
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd, MM, uuuu", Locale.US);
        String formatted = dtf.format(odt);
        System.out.println(formatted);
    }
}

Выход:

      2006-03-25T10:30+12:00
25, 03, 2006

Узнайте больше о современном API даты и времени из Trail: Date Time.

  1. Ваш форматер не соответствует входному формату. В основном вам нужно два форматтера: один для ввода и один для вывода.
  2. Формат «дд, мм, гггг» неверен: мм обозначает минуты часа, а не месяц. Вы должны использовать «дд, мм, гггг».
      val launchDate = "2006-03-25T10:30:00+12:00"

val inputFormatter = DateTimeFormatter.ISO_DATE_TIME
val myDate = LocalDate.parse(launchDate, inputFormatter)

val outputFormatter = DateTimeFormatter.ofPattern("dd, MM, yyyy", Locale.US)
println(outputFormatter.format(myDate))
Другие вопросы по тегам