Java-константы для дней недели в Postgresql - PullRequest
0 голосов
/ 18 мая 2018

Postgresql возвращает день недели, используя EXTRACT с dow следующим образом: 0 - воскресенье, 1 - понедельник, вплоть до 6 - суббота, см. Официальную документацию .

Я ищу некоторые официальные константы либо в самой Java, либо в JDBC, либо, возможно, в какой-нибудь стандартной библиотеке (Apache Commons?), Которая соответствует этой нумерации.

Ответы [ 3 ]

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

Согласно той же официальной документации вы должны использовать isodow:

День недели с понедельника (1) по воскресенье (7)

0 голосов
/ 04 июня 2018

tl; dr

Я ищу официальные константы либо в самой Java

Да, Java определяет значения семи дней недели в DayOfWeek перечисление с использованием того же стандартного определения ISO 8601, что и функция isodow в Postgres, где неделя начинается с понедельника по воскресенье с днями 1-7.

DayOfWeek.WEDNESDAY.getValue()  // Returns an `int` 1-7 for Monday-Sunday. 

3

java.time.DayOfWeek enum

Как подсказывает Ответ Rcordoval , используйте функцию Postgres isodow.

«iso» в isodow относится к стандарту ISO 8601 и определению недели , где дни с понедельника по воскресенье пронумерованы 1-7.

Java поддерживает то же самое определение недели в своем перечислении DayOfWeek.Этот класс определяет для вас семь объектов, по одному на каждый день недели, например DayOfWeek.MONDAY.Чтобы получить номер дня недели для каждого объекта, 1-7 для понедельника-воскресенья, позвоните по номеру DayOfWeek::getValue.Но в вашем Java-кодировании сосредоточьтесь на использовании и передаче самих DayOfWeek объектов, а не простых целых чисел.

int dowNumber = DayOfWeek.WEDNESDAY.getValue() ;

3

Исходя из целого числаЧисло для объекта DayOfWeek немного сложнее, так как нам нужен доступ к массиву Java с помощью индекса.Индекс означает отсчет с нуля, поэтому вычтите его из числа дня недели.Среда - день № 3, поэтому вычтите 1 из результата 2, чтобы получить DayOfWeek.WEDNESDAY.

DayOfWeek dow = DayOfWeek.values()[ 3-1 ] ;  // Get object named `WEDNESDAY` using zero-based index counting, so 3 - 1 = 2.

dow.toString (): СРЕДА

Кстати, чтобы автоматически локализовать название дня недели, звоните DayOfWeek::getDisplayName.

Java, а не SQL

В настоящее время я пишу запрос, который находит клиентов, у которых в пятницу 10:00 утра в их соответствующем часовом поясе, поэтому мне нужно передатьпонятие «пятница» в запросе и, конечно, я не хочу его жестко кодировать.

Может быть, лучше сделать эту работу в Java, используя ведущую в отрасли java.time классы, а не в SQL.

Вы должны быть очень осторожны с часовыми поясами.Будьте точны с часовыми поясами, а не полагайтесь на неявные зоны по умолчанию.

Часовой пояс имеет решающее значение при определении даты.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париж Франция - это новый день, в то время как "вчера" в Монреаль Квебек .

Если часовой пояс не указан,JVM неявно применяет свой текущий часовой пояс по умолчанию.Это значение по умолчанию может измениться в любой момент, поэтому ваши результаты могут отличаться.Лучше явно указать желаемый / ожидаемый часовой пояс в качестве аргумента.

Укажите правильное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland.Никогда не используйте 3-4-буквенное сокращение, например EST или IST, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

Если вы хотите использовать текущий часовой пояс JVM по умолчанию, запросите его и передайте в качестве аргумента.Если опущено, текущее значение по умолчанию JVM применяется неявно.Лучше быть явным, поскольку значение по умолчанию может быть изменено в любой момент во время выполнения любым кодом в любом потоке любого приложения в JVM.

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Далее получите следующую пятницуили придерживайтесь сегодняшнего дня, если это уже пятница.Используйте TemporalAdjuster для корректировки между датами, в частности, указанную в TemporalAdjusters.

LocalDate nextOrSameFriday = today.with( TemporalAdjusters.nextOrSame( DayOfWeek.FRIDAY ) ) ;

Вы сказали, что нацеливаетесь на 10 утра.

LocalTime lt = LocalTime.of( 10 , 0 ) ;  // 10 AM.

Объедините с датой и зоной, чтобы получить определенный момент.

ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

Настройте UTC, извлекая объект Instant.Тот же момент, та же точка на временной шкале, но другое время на настенных часах.

Instant instant = zdt.toInstant() ;

Сформулируйте свой SQL для запроса столбца базы данных типа TIMESTAMP WITH TIME ZONE.

String sql = "SELECT * from tbl WHERE when_col = ? ; " ;
…
myPreparedStatement.setObject( … , instant ) ;

И поиск.

Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

При таком подходе вам нужны функции dow или isodow в Postgres.


О программе 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 API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 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 голосов
/ 18 мая 2018

Вы можете использовать Calendar константы минус 1, чтобы вы могли сопоставить значения PostgreSQL, например: Calendar.SUNDAY = 1

...