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()
.
Ссылки