Работа с датами и часовыми поясами в Groovy
Иногда требуется осуществлять манипуляции с датами, такие как их парсинг или форматирование в определенный вид. Groovy предоставляет расширения, которые упрощают управление датами, делая этот процесс более легким и интуитивно понятным.
Для примера мы используем проект, созданный с использованием шаблона "Web Blog", и внедрим в него скрипт, который будет выполняться при предварительном просмотре страницы.
Для начала настроим часовой пояс в CMS Engine. Для этого перейдите в боковую панель, затем в Инструменты сайта > Конфигурация > Конфигурация ядра проекта и добавьте следующее в конфигурацию:
<?xml version="1.0" encoding="UTF-8"?>
<site>
<timeZone>America/Los_Angeles</timeZone>
</site>
Теперь создадим контроллер. Для этого перейдите в боковую панель, затем по пути Скрипты > scripts > pages, щелкните правой кнопкой мыши по pages и выберите Новый контроллер. Назовите контроллер article.groovy, что заставит его выполняться перед загрузкой страницы статьи.
Теперь рассмотрим примеры работы с датами и временем в Groovy. Мы будем выполнять операции с переменной contentModel date_dt
, которая является датой создания статьи. Дополнительные сведения о переменных, доступных в скриптах groovy, можно найти здесь.
Форматирование дат
Чтобы отформатировать дату по определенному шаблону формата, который мы затем передаем в переменную templateModel
, чтобы мы могли использовать ее в шаблоне Freemarker, выполните следующее:
def formattedDate = aDate.format("EEEE, MMMM dd, yyyy, hh:mm a '('zzz')'")
templateModel.formattedDate = formattedDate
Что выведет следующее: Tuesday, December 27, 2021, 09:00 PM (PST)
.
Чтобы отформатировать дату в соответствии с определенным шаблоном формата и часовым поясом, выполните следующее:
def formattedDate = aDate.format("EEEE, MMMM dd, yyyy, hh:mm a '('zzz')'", TimeZone.getTimeZone("EST5EDT"))
Что выведет следующее: Wednesday, December 28, 2021, 12:00 AM (EST)
.
Давайте рассмотрим другой пример форматирования даты по определенному шаблону формата с использованием настройки часового пояса в файле конфигурации “Конфигурация ядра проекта”, используя переменную siteConfig
:
def formattedDate = aDate.format("EEE, MMMM dd, yyyy, hh:mm a '('zzz')'", TimeZone.getTimeZone(siteConfig.getString("timeZone")))
Что выведет следующее: Tue, December 27, 2021, 09:00 PM (PST)
Дополнительные сведения о шаблонах форматирования можно найти здесь.
Дополнительные сведения о смещении часового пояса можно найти здесь.
Разбор (парсинг) дат
Чтобы преобразовать строку даты в объект даты (чтобы вы могли выполнять арифметические операции с датами, получать значения года, месяца, даты отдельно), выполните следующее:
def nowString = "2022-Oct-26 11:45:23 PM"
def nowDate = Date.parse("yyyy-MMM-dd hh:mm:ss a", nowString)
Что выведет следующее: Thu Oct 26 23:45:23 PDT 2022
.
Арифметические операции с датами
Мы будем использовать тот же пример, что был приведен выше, для выполнения арифметических операций с объектом даты. Существует два способа выполнения арифметических операций с объектами дат: с использованием методов plus
и minus
и с использованием операторов +
и -
.
Например, мы хотим найти объект даты через 10 дней после даты в нашем примере выше. Мы будем использовать метод plus
и оператор +
, чтобы увеличить дату на 10 дней:
def nowString = "2022-Oct-26 11:45:23 PM"
def nowDate = Date.parse("yyyy-MMM-dd hh:mm:ss a", nowString)
def addDate = nowDate.plus(10) //
def addDate2 = nowDate + 10 //
И addDate
, и addDate2
, выведут следующее: Sun Nov 05 23:45:23 PST 2022
.
Теперь, если мы хотим узнать объект даты за 30 дней до даты в нашем примере, мы можем использовать либо метод minus
, либо оператор -
для уменьшения даты:
def subDate = nowDate.minus(30) //
def subDate2 = nowDate - 30 //
И subDate
, и subDate2
будут выводить следующее: Tue Sep 26 23:45:23 PDT 2022
.
Дополнительные сведения о методах Groovy Date можно найти по этой ссылке.