Получите все ночные даты на Яве - PullRequest
0 голосов
/ 08 декабря 2018

Я пытался отсортировать список преступлений и отсортировать объекты по дневным и ночным спискам.Таким образом, дневное время может быть с 6 утра до 10 вечера, а ночное время может быть с 10 вечера до 6 утра.Я написал заявление if, чтобы попытаться заполнить список ночных преступлений.

    if(data.getDate().getHours() < 6 && data.getDate().getHours() > 22) {
            System.out.println(data.getDate().toLocaleString());
            nightCrimes.add(data);
    }

Хотя ничего не печатается и список остается пустым.Я заметил, что логика явно неверна, потому что конкретное целое число (час) не может быть больше 22 и меньше 6. Есть ли лучший способ для меня это сделать?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

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?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесено в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии Android связывают реализации классов java.time .
    • Для более ранних версий Android (<26), <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP Проект адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 08 декабря 2018

Единственное, что вам нужно изменить, это заменить && на ||.Вот новый оператор if

if(data.getDate().getHours() < 6 || data.getDate().getHours() > 22)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...