Календарь Java определяет день и диапазон времени недели для сравнения с - PullRequest
0 голосов
/ 24 мая 2018

Мне нужно определить разные периоды на неделе.Затем мне нужно передать ряд объектов Календаря, чтобы увидеть, какому периоду соответствуют эти объекты Календаря.

например, Period1:

    Mon 12:00-15:00
    Tue 14:00-17:00

Period2:

    Wed,Thu 09:00-17:00

Period3:

    Thur 17:00-24:00
    Fri  00:00-24:00

Как лучше всего определить эти периоды в коде для передачи в объекты календаря, чтобы увидеть, какому из них, если таковые имеются, они соответствуют?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Java 7 и ThreeTen Backport

Ответ Майкла хорош.Я просто хотел бы предоставить несколько деталей.Поскольку вы упомянули в другой вопрос о том, что вы используете Java 7, я представляю код для Java 7.

Во-первых, классы даты и времени, которые использует Майкл, не встроены в Java 7, но были перенесены.Так что получите ThreeTen Backport, который он упоминает, и импортируйте классы даты и времени из пакета org.threeten.bp:

import org.threeten.bp.DateTimeUtils;
import org.threeten.bp.DayOfWeek;
import org.threeten.bp.LocalTime;
import org.threeten.bp.ZoneId;
import org.threeten.bp.ZonedDateTime;

Затем добавьте следующий метод в класс WeekPeriod Майкла:

public boolean isInPeriod(ZonedDateTime dateTime) {
    DayOfWeek dowToCheck = dateTime.getDayOfWeek();
    LocalTime timeToCheck = dateTime.toLocalTime();
    return dowToCheck.equals(day)
            && ! timeToCheck.isBefore(start)
            && timeToCheck.isBefore(end);
}

Если вы предпочитаете, чтобы параметр был LocalDateTime или OffsetDateTime, просто измените его, код тот же.Конечно, вы можете перегрузить метод, чтобы принять все три типа.

Если вы не можете избежать получения Calendar объектов, напишите для них также один или два перегруженных метода.Преобразуйте ваш Calendar в ZonedDateTime и вызовите вышеуказанный метод.Это немного проще, если ваш Calendar является GregorianCalendar, который, вероятно, равен:

public boolean isInPeriod(GregorianCalendar cal) {
    return isInPeriod(DateTimeUtils.toZonedDateTime(cal));
}

Если это не так:

public boolean isInPeriod(Calendar cal) {
    ZoneId zone = DateTimeUtils.toZoneId(cal.getTimeZone());
    return isInPeriod(DateTimeUtils.toInstant(cal).atZone(zone));
}

Все вышеперечисленноеработает в Java 7 и в Java 6 тоже.Я тестировал на jdk1.7.0_79.

Java 8 и более поздних версиях

Для всех, кто читает и использует Java 8 или более поздние версии:

  • Импорт даты и времениклассы из пакета java.time вместо (не используйте ThreeTen Backport).
  • Вместо использования DateTimeUtils конвертируйте, используя методы, встроенные в Calendar и GregorianCalendar из Java 8. ДляGregorianCalendar использовать cal.toZonedDateTime().Для других Calendar подклассов используйте cal.getTimeZone().toZoneId(), а затем cal.toInstant().

Ссылки

0 голосов
/ 24 мая 2018

Всегда отдавайте предпочтение классам java.time (или Joda-Time или ThreeTen backport , если вы еще не используете Java 8).См. в этой статье «почему».

Я бы использовал DayOfWeek и два LocalTime s

class WeekPeriod
{
    private final DayOfWeek day;
    private final LocalTime start;
    private final LocalTime end;

    //constructor and methods
}

Объедините их в три Set<WeekPeriod> с, чтобы представить ваши три примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...