Разбор простого гражданского времени до полной даты и времени с использованием Joda Time - PullRequest
0 голосов
/ 12 июня 2019

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

"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);

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

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

К вашему сведению, проект 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

Большинство *Функции 1040 * java.time перенесены на Java 6 и Java 7 в проекте ThreeTen-Backport .Дополнительно адаптировано для более ранних версий Android (<26) в <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP .См. Как использовать ThreeTenABP… .

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

2 голосов
/ 12 июня 2019

Василий Бурк прав, что вы предпочитаете 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-часовым часамЯ предположил, что это был результат, который вы хотели.Если вы хотите отформатировать без миллисекунд, просто отформатируйте 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.

...