tl; dr
Как говорит правильный ответ *1004* Джорджа Фокса, прямой ответ на ваш вопрос - использование логического ИЛИ, а не И.
Но у вас есть другие проблемы с вашим кодом:
- Игнорирование важного вопроса часовой пояс
- Использование кровавого ужасная дата-классы времени , теперь устарели.
Фрагмент кода:
data
.getDate() // Using terrible old `java.time.Date` class.
.toInstant() // Convert from legacy class to modern class.
.atZone( // Adjust from UTC to your own local time zone.
ZoneId.of( "Africa/Tunis" ) // Use proper time zone name in `Continent/Region` format.
) // Returns a `ZonedDateTime` object, a moment as seen through the wall-clock time used by the people of a particular region (a time zone).
.getHour() // Returns an `int` for hour-of-day.
… (равно или больше 22) ИЛИ (меньше 6) = ночное времяvalue.
java.time
Видимо, вы используете ужасные старые классы даты и времени, в результате чего ваш вызов на getHours
составляет java.util.Date::getHours
.
Эти устаревшие классы были вытеснены годами назад ведущими в отрасли java.time классами.
Кстати, Date::getHours
также устарела.
Часовой пояс
Если вы используете java.util.Date
, то вы игнорируете важнейшую проблему часового пояса.Date
представляет момент в UTC, всегда UTC по определению.
Таким образом, если вы не проживаете в Исландии, запрос времени в UTC будет не , совпадающим с вашимсобственные местные дневные и ночные часы.
Сначала конвертируйте Date
в современный java.time.Instant
.Для этого вы можете использовать новые методы, добавленные к старым классам.
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy class to modern class.
Затем примените часовой пояс для вашей местности, чтобы получить ZonedDateTime
.
Укажите собственное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Сравните время суток, как показано в вашем вопросе.
static final int MORNING_HOUR = 6 ;
static final int EVENING_HOUR = 22 ;
…
int hour = zdt.getHour() ;
boolean isNighttime =
( hour >= EVENING_HOUR ) // Include this hour.
||
( hour < MORNING_HOUR ) // Exclude this hour.
;
Вы можете собрать их в Map
, где ключом является строка «nighttime» или «daytime», а значением является Set
из Crime
объектов.A Set
устраняет дубликаты.Если вы хотите, чтобы преступления были отсортированы, используйте SortedSet
.
Map < String, SortedSet < Crime > > dayOrNight = new HashMap <>( 2 );
dayOrNight.put( "daytime" , new TreeSet <>() );
dayOrNight.put( "nighttime" , new TreeSet <>() );
Collect.
if( isNighttime ) {
dayOrNight.get( "nighttime" ).add( crime ) ;
} else { // Else, must be daytime.
dayOrNight.get( "daytime" ).add( crime ) ;
}
Давайте теперь раскручиваем этот код, чтобы использовать время в день, а не час в случае, если ваши бизнес-правила когда-либо будут переопределены, чтобы бытьнеполный час.
Периоды времени обычно лучше всего определять с использованием подхода Half-Open.Начало включительно , а окончание эксклюзив .Таким образом, ночное время начинается с первого момента в 22 часа и продолжается, но не включает первый момент в 6 часов утра.
Совет: более короткий способ задать вопрос «равен или позже 10»PM »-« Если не раньше
LocalTime morning = LocalTime.of( 6 , 0 ) ;
LocalTime evening = LocalTime.of( 22 , 0 ) ;
LocalTime lt = zdt.toLocalTime() ;
boolean isNighttime = ( ! lt.isBefore( evening ) ) || lt.isBefore( morning ) ;
if( isNighttime ) {
dayOrNight.get( "nighttime" ).add( crime ) ;
} else { // Else, must be daytime.
dayOrNight.get( "daytime" ).add( crime ) ;
}
О java.time
java.time Фреймворк встроен в Java 8 и выше.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .