Joda времени
Joda-Time 2,3 библиотека делает эту работу намного проще. Он включает класс Interval с методом overlap
.
См. the answer by MadProgrammer для получения аналогичного кода и обсуждения.
Ключевых моментов
Interval класса умный, учитывая начало интервала быть включен и заканчивая эксклюзивные. Вы должны делать сравнения, основанные на логике EQUAL TO ИЛИ БОЛЬШЕ, чем начало, но МЕНЬШЕ, чем остановка. Зачем? Потому что момент перед новым днем бесконечно делится. Вы можете подумать: «Хорошо java.util.Date & Решение Joda-Time разрешает миллисекунды, поэтому я буду использовать .999». Но тогда вы будете удивлены, когда переносите код на новые классы Java Java.time. *, Где время разрешается наносекундами.
Для поддержки этого сравнения, обратите внимание, что цель недели определяется с помощью вызова withTimeAtStartOfDay
. Используйте этот метод, а не пытайтесь создать полночь, установив нулевые элементы времени. Этот метод является умным и управляет временем перехода на летнее время и другими аномалиями, где в определенные часовые пояса не может быть 00:00:00 полночь в определенные дни.
Укажите часовой пояс, а не полагайтесь на значения по умолчанию. Весь код в других ответах не учитывает часовой пояс. Это означает, что они используют часовой пояс по умолчанию для JVM. Как следствие, это приложение получает разные результаты при развертывании на другие компьютеры, установленные в другие часовые пояса. Используйте proper time zone names, а не 3-буквенные коды.
Если ваше приложение относится к людям и местным часовым поясам, вы должны подумать о том, чтобы указать целевую неделю на UTC/GMT (без смещения часового пояса). Обратите внимание: это то, что StackOverflow делает для отслеживания активности каждый день. «День» определяется UTC/GMT.
Эти пункты являются доказательством того, почему вы не должны откатывать свою собственную логику даты и времени. Вместо этого используйте грамотную библиотеку. В Java это означает либо Joda-Time, либо новые классы java.time. * В Java 8 (вдохновленные Joda-Time).
ISO Неделя
К слову, ISO 8601 standard defines a "week" точно. Этот стандарт применяется в других странах и отраслях промышленности в разных странах. Следуя этому стандарту, может оказаться полезным. Случай Joda-Time DateTime знает свой номер недели ISO. Позвоните по телефону myDateTime.weekOfWeakYear().get()
.
Пример кода
DateTimeZone timeZone = DateTimeZone.forID("Europe/Berlin");
Interval weekInQuestion = new Interval(new DateTime(2014, 1, 20, 3, 4, 5, timeZone).withTimeAtStartOfDay(), new DateTime(2014, 1, 27, 3, 4, 5, timeZone).withTimeAtStartOfDay());
Interval i1 = new Interval(new DateTime(2014, 1, 2, 3, 4, 5, timeZone), new DateTime(2014, 1, 3, 23, 4, 5, timeZone));
Interval i2 = new Interval(new DateTime(2014, 1, 24, 3, 4, 5, timeZone), new DateTime(2014, 1, 26, 23, 59, 59, timeZone));
Interval i3 = new Interval(new DateTime(2014, 1, 6, 3, 4, 5, timeZone), new DateTime(2014, 1, 30, 3, 4, 5, timeZone));
boolean i1HitsWeekInQuestion = i1.overlaps(weekInQuestion);
boolean i2HitsWeekInQuestion = i2.overlaps(weekInQuestion);
boolean i3HitsWeekInQuestion = i3.overlaps(weekInQuestion);
самосвала утешать ...
System.out.println("weekInQuestion: " + weekInQuestion);
System.out.println("i1: " + i1 + " hits week: " + i1HitsWeekInQuestion);
System.out.println("i2: " + i2 + " hits week: " + i2HitsWeekInQuestion);
System.out.println("i3: " + i3 + " hits week: " + i3HitsWeekInQuestion);
При запуске ...
weekInQuestion: 2014-01-20T00:00:00.000+01:00/2014-01-27T00:00:00.000+01:00
i1: 2014-01-02T03:04:05.000+01:00/2014-01-03T23:04:05.000+01:00 hits week: false
i2: 2014-01-24T03:04:05.000+01:00/2014-01-26T23:59:59.000+01:00 hits week: true
i3: 2014-01-06T03:04:05.000+01:00/2014-01-30T03:04:05.000+01:00 hits week: true
что параметр дата должно означать, что вы передаете в? –
это простые объекты дат java. Каждая «запись» имеет объект даты как дату начала и дату окончания, а класс «Util» возвращает объекты даты для даты ввода для доставки понедельника и воскресенья (в моем случае для каждой ячейки). –
Почему вы не хотите использовать йоду? – bobah