Вопрос:

Разбор простого гражданского времени до полной даты и времени с использованием Joda Time

java android time jodatime

31 просмотра

2 ответа

15 Репутация автора

У меня есть строка временного интервала, заданная как:

"04:00 PM - 04:30 PM"

Моя цель - проанализировать эту строку, используя Joda Time, в переменную времени начала и конца, которая выглядит следующим образом:

String startTime = "2019-06-11T04:00:00"

String endTime = "2019-06-11T04:30:00"

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

Спасибо за любую помощь!

Моя текущая попытка была:

String[] selectedTime = interval.split(" - ");
DateTimeFormatter parser = ISODateTimeFormat.dateTime();
DateTime dtStart = parser.parseDateTime(selectedTime[0]);
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss");
String startTime = formatter.print(dtStart);

Я понимаю, почему это не работает, поскольку я не передаю всю необходимую информацию, такую ​​как год, месяц, дата и миллисекунды.

Автор: Bob Duncan Источник Размещён: 11.06.2019 11:47

Ответы (2)


3 плюса

123562 Репутация автора

К вашему сведению, проект Joda-Time сейчас находится в режиме обслуживания , что позволяет перейти на классы java.time . Смотрите Учебник по Oracle .

java.time

В ваших входах отсутствует индикатор часового пояса или смещения от UTC. Так что разбирайте как LocalDateTimeобъекты.

Ваш вводимый текст в стандартном формате ISO 8601. Эти стандартные форматы по умолчанию используются в классах java.time для генерации / разбора строк. Поэтому нет необходимости указывать шаблон форматирования.

LocalDateTime ldt = LocalDateTime.parse( "2019-06-11T04:00:00" ) ;

Вам нужно только время суток, поэтому извлекайте LocalTimeобъект.

LocalTime lt = ldt.toLocalTime() ;

Как правило, лучше всего, чтобы DateTimeFormatterкласс автоматически локализовался для вас.

Locale locale = Locale.CANADA_FRENCH ;  // Or Locale.US, Locale.ITALY, etc.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedTime( FormatStyle.MEDIUM ).withLocale( locale ) ;
String output = lt.format( f ) + " — " + otherLt.format( f ) ;

В противном случае укажите конкретный шаблон форматирования, если необходимо.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "HH:mm a" , Locale.US ) ;
String output = lt.format( f ) + " to " + otherLt.format( f ) ;

Ранее Android

Большая часть  функций java.time перенесена в Java 6 и Java 7 в проекте ThreeTen-Backport . Далее адаптирован для более ранней версии Android (<26) в ThreeTenABP . Смотрите Как использовать ThreeTenABP… .

Для Android 26 и более поздних версий встроенная реализация java.time .

Автор: Basil Bourque Размещён: 12.06.2019 02:44

2 плюса

34467 Репутация автора

Решение

Василий Бурк прав, что вы предпочитаете java.time, современный Java-интерфейс даты и времени, а не Joda-Time. Если вы уже много используете Joda-Time и не хотите переходить на java.time прямо сейчас, вот решение Joda-Time для вашего вопроса. Изменить: я переписал код, чтобы учесть следующий комментарий от вас:

… Не могли бы вы оказать некоторую помощь относительно того, как определить конечное время - часовой пояс? Есть такой случай, когда интервал будет от «11:30 до 12:00». Сейчас текущее время 11:30, поэтому DateTimeZone вернет сегодняшнюю дату. Поскольку я пытаюсь сгенерировать строку для времени окончания, ее дата будет установлена ​​на сегодняшнюю дату, но последняя строка должна иметь дату следующего дня, потому что это ссылка на 12:00 утра.…

    String interval = "04:00 PM - 04:30 PM";
    String[] selectedTime = interval.split(" - ");
    DateTimeFormatter parser = DateTimeFormat.forPattern("hh:mm a");
    LocalDate today = new LocalDate(DateTimeZone.getDefault());
    LocalTime tStart = parser.parseLocalTime(selectedTime[0]);

    String startTime = today.toLocalDateTime(tStart).toString();
    System.out.println("Start time: " + startTime);

При запуске сегодня вывод:

Время начала: 2019-06-12T16: 00: 00.000

Поскольку 16:00 - это 24 часа на 24 часа, я предположил, что это именно тот результат, который вы хотели. Если вы хотите форматировать без миллисекунд, просто отформатируйте, как LocalDateTimeвы получите, как вы форматируете dtStartв своем вопросе.

Время окончания немного сложнее:

    LocalTime tEnd = parser.parseLocalTime(selectedTime[1]);
    String endTime;
    if (tEnd.isBefore(tStart)) {
        // Assume that end time is after midnight, that is, tomorrow
        endTime = today.plusDays(1).toLocalDateTime(tEnd).toString();
    } else {
        // The normal case: both start and end times are today
        endTime = today.toLocalDateTime(tEnd).toString();
    }
    System.out.println("End time: " + endTime);

Время окончания: 2019-06-12T16: 30: 00.000

Если бы вместо этого мы имели

    String interval = "11:30 PM - 12:00 AM";

Время окончания: 2019-06-13T00: 00: 00.000

Joda-Time находится в режиме обслуживания

Цитата с домашней страницы Joda-Time:

Обратите внимание, что Joda-Time считается в основном «законченным» проектом. Никаких серьезных улучшений не планируется. Если используется Java SE 8, перейдите на java.time(JSR-310).

( https://www.joda.org/joda-time/ )

Даже если вы пишете для более старого Android (ниже уровня API 26), по крайней мере, для нового кода я бы предпочел зависимость от ThreeTenABP, а не от Joda-Time.

Автор: Ole V.V. Размещён: 12.06.2019 11:24
Вопросы из категории :
32x32