JodaTime не работает

Я новичок в Android и у меня проблемы с работой с Jodatime. Я получаю ту же ошибку, что и многие люди здесь, и я попробовал все предложения, но ничего не работает для меня. Я пытаюсь отобразить переменные, выбранные пользователем из палитры даты и времени, например, "dayNow, monthNow" и т. Д., В одну комбинированную переменную, названную "timeselected", и установить для нее текстовое поле, чтобы затем можно было выполнять вычисления в йодатиме далее вниз,

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

            DateTime dateTime = new DateTime(timeselected);
            DateTimeFormatter fmt = DateTimeFormat.forPattern("dd MM yyyy" + "\n" + " h:mm a ");
            String formattedtime = fmt.print(dateTime);
            CalculateButton.setText(formattedtime);

            // Plus some hours, minutes, and seconds to the original DateTime.
            DateTimeFormatter fmt2 = DateTimeFormat.forPattern("dd MM yyyy" + "\n" + " h:mm a ");

            DateTime dateTime1 = dateTime.plusHours(timeadded);
            String endtimecalc = fmt2.print(dateTime1);
            TextView endtime = (TextView) findViewById(endtimetextView);
            endtime.setVisibility(View.VISIBLE);
            endtime.setText(endtimecalc);

            String timeselected = dayNow + "-" + monthNow + "-" + yearNow + " " + hourNow + ":" + minuteNow;

            DateTime datetimselected = DateTime.parse(timeselected);

            usertimeselection.setText((CharSequence) datetimselected.toDate());

        }
    });

Неустранимое исключение: основной процесс: com.almac.tracker, PID: 29114 java.lang.IllegalArgumentException: Неверный формат: "2017-11-23 T 4:56" искажен в " T 4:56" в org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:945) в org.joda.time.DateTime.parse(DateTime.java:160) в org.joda.time.DateTime.parse(DateTime.java:149) в com.almac.tracker.CreateLine$5.onClick(CreateLine.java:274) на android.view.View.performClick(View.java:6219) на android.view.View$PerformClick.run(View.java:24482) на android.os.Handler.handleCallback(Handler.java:769) на android.os.Handler.dispatchMessage(Handler.java:98) на android.os.Looper.loop(Looper.java:164) на android.app.ActivityThread.main(ActivityThread.java:6540) на java.lang.reflect.Method.invoke(собственный метод) на com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

1 ответ

От DateTime.parse(String str) документация:

Анализирует DateTime из указанной строки.

Это использует ISODateTimeFormat.dateTimeParser().

Ваша строка даты и времени недопустима для ISODateTimeFormat не принимает / но -,

Так что либо поменяй / в - и соблюдать правило: date-opt-time = date-element ['T' [time-element] [offset]] (смотрите, что 'T' между элементами даты и времени!) Таким образом, ваша строка даты и времени должна быть такой:

String timeselected = yearNow + "-" + monthNow + "-" + dayNow + "'T'" + hourNow + ":" + minuteNow;
DateTime datetimselected = DateTime.parse(timeselected);

либо используйте свой собственный форматер через DateTime.parse(String str, DateTimeFormatter formatter) метод.

ОБНОВЛЕНИЕ 1

После запуска некоторых тестов действительно 'T' не принимается парсером по умолчанию. Строка, которая проходит от парсера:

"2017-11-23T04:56"

Поэтому убедитесь, что между разделом даты, символом "T" и разделом времени нет пробелов.

String timeselected = yearNow + "-" + monthNow + "-" + dayNow + "T" + hourNow + ":" + minuteNow;

ОБНОВЛЕНИЕ 2

Прикрепление моего тестового кода для парсера

public class Main {
    public static void main(String[] args) {
        String timeselected = "2017-11-23T04:56";
        DateTime datetimselected = DateTime.parse(timeselected);
        System.out.println(datetimselected.toDate());
    }
}

выход:

Thu Nov 23 04:56:00 EET 2017
Другие вопросы по тегам