Работа с датами и часовыми поясами в Groovy

В этой статье вы узнаете о расширениях Groovy, которые позволяют работать с датами и часовыми поясами.

Иногда требуется осуществлять манипуляции с датами, такие как их парсинг или форматирование в определенный вид. Groovy предоставляет расширения, которые упрощают управление датами, делая этот процесс более легким и интуитивно понятным.

Для примера мы используем проект, созданный с использованием шаблона "Web Blog", и внедрим в него скрипт, который будет выполняться при предварительном просмотре страницы.

Для начала настроим часовой пояс в CMS Engine. Для этого перейдите в боковую панель, затем в Инструменты сайта > Конфигурация > Конфигурация ядра проекта и добавьте следующее в конфигурацию:

<?xml version="1.0" encoding="UTF-8"?>
<site>
    <timeZone>America/Los_Angeles</timeZone>
</site>

Copy-icon

Теперь создадим контроллер. Для этого перейдите в боковую панель, затем по пути Скрипты > 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

Copy-icon

Что выведет следующее: Tuesday, December 27, 2021, 09:00 PM (PST).

Чтобы отформатировать дату в соответствии с определенным шаблоном формата и часовым поясом, выполните следующее:

def formattedDate = aDate.format("EEEE, MMMM dd, yyyy, hh:mm a '('zzz')'", TimeZone.getTimeZone("EST5EDT"))

Copy-icon

Что выведет следующее: 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")))

Copy-icon

Что выведет следующее: 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)

Copy-icon

Что выведет следующее: 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     //

Copy-icon

И addDate, и addDate2, выведут следующее: Sun Nov 05 23:45:23 PST 2022.

Теперь, если мы хотим узнать объект даты за 30 дней до даты в нашем примере, мы можем использовать либо метод minus, либо оператор - для уменьшения даты:

def subDate = nowDate.minus(30)  //
def subDate2 = nowDate - 30      //

Copy-icon

И subDate, и subDate2 будут выводить следующее: Tue Sep 26 23:45:23 PDT 2022.

Дополнительные сведения о методах Groovy Date можно найти по этой ссылке.

Связанные статьи

Разработка на Groovy

Документация для разработчиков