Статьи

Groovy JDK (GDK): дата и календарь

Я рассмотрел некоторые очень полезные методы, доступные в расширениях Groovy GDK для Java JDK, в сообщениях блога, таких как Groovy JDK (GDK): File.deleteDir () , Groovy JDK (GDK): текстовый файл в строку , Groovy JDK ( GDK): больше возможностей для файлов , Groovy JDK (GDK): поддержка строк и Groovy JDK (GDK): поддержка чисел . В этой статье я рассмотрю некоторые замечательные возможности расширений Groovy GDK для классов Java JDK java.util.Date и java.util.Calendar .

Текущая стандартная поддержка Java для дат и времени обычно не нравится в сообществе разработчиков Java. Многие из нас с нетерпением ждут JSR-310 и / или уже используют Joda Time, чтобы обойти недостатки обработки датой и временем в Java.

Groovy немного облегчает работу с датами и временем, когда сторонние фреймворки недоступны или не могут использоваться. Расширение Date в Groovy GDK предоставляет несколько новых и очень полезных методов, как показано на снимке экрана с документацией .

Вот некоторые из этих полезных методов, которые я выделю в этом посте: clearTime () , format (String) , getDateString () , getTimeString (), parse (String, String) , parseToStringDate (String) , toCalendar () , toTimestamp () , и обновленный (Карта) . Многие другие методы, перечисленные в API, поддерживают перегрузку операторов Groovy и не рассматриваются в этом посте.

Date.clearTime () и Calendar.clearTime ()

Бывают моменты, когда кто-то желает представлять только дату, и временная часть Date или Calendar не важна (именно поэтому JSR 310 переносит конструкции только с датами, такие как LocalDate, в JDK 8). В таких случаях расширение Groovy до Date и Calendar позволяет легко «очистить» компонент времени. Следующий листинг кода демонстрирует использование Date.clearTime() за которым следует снимок экрана, показывающий, что этот код выполнен. Обратите внимание, что метод clearTime () изменяет объект, на который он действует.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
/**
 * Demonstrates Groovy's GDK Date.clearTime() method. Note that the clearTime()
 * method acts upon the Date object upon which it is called, mutating its value
 * in addition to returning a reference to that changed object.
 */
def demoClearTime()
{
   printTitle('Groovy GDK Date.clearTime()')
   def now = new Date()
   println 'Now: ${now}'
   def timelessNow = now.clearTime()
   println 'Now sans Time: ${timelessNow}'
   println 'Mutated Time:  ${now}'
}

Функция clearTime () в Calendar работает аналогично тому, как показано в следующем фрагменте кода и на сопровождающем снимке экрана его выполнения.

01
02
03
04
05
06
07
08
09
10
11
12
13
/**
 * Demonstrates Groovy's GDK Calendar.clearTime() method. Note that the
 * clearTime() method acts upon the Calendar object upon which it is called,
 * mutating its value in addition to returning a reference to that changed object.
 */
def demoCalendarClearTime()
{
   printTitle('Groovy GDK Calendar.clearTime()')
   def now = Calendar.getInstance()
   println 'Now: ${now}'
   now.clearTime()
   println 'Now is Timeless: ${now}'
}

Date.format и Calendar.format

При разработке Java часто требуется отображать Date или Calendar в определенном удобном для пользователя формате, и это обычно выполняется с использованием экземпляров SimpleDateFormat . Groovy упрощает этот процесс применения формата к Date или строке с помощью соответствующих методов Date.format (String) и Calendar.format (String) . Списки кодов, демонстрирующие каждый из них, показаны далее с каждым списком кодов, за которым следует снимок экрана с отображением выполненного кода.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
/**
 * Demonstrate how much more easily a formatted String representation of a Date
 * can be acquired in Groovy using GDK Date.format(String). No need for an
 * explicit instance of SimpleDateFormat or any other DateFormat implementation
 * here!
 */
def demoFormat()
{
   printTitle('Groovy GDK Date.format(String)')
   def now = new Date()
   println 'Now: ${now}'
   def dateString = now.format('yyyy-MMM-dd HH:mm:ss a')
   println 'Formatted Now: ${dateString}'
}

01
02
03
04
05
06
07
08
09
10
11
12
13
14
/**
 * Demonstrate how much more easily a formatted String representation of a
 * Calendar can be acquired in Groovy using GDK Calendar.format(String). No need
 * for an explicit instance of SimpleDateFormat or any other DateFormat
 * implementation here!
 */
def demoCalendarFormat()
{
   printTitle('Groovy GDK Calendar.format(String)')
   def now = Calendar.getInstance()
   println 'Now: ${now}'
   def calendarString = now.format('yyyy-MMM-dd HH:mm:ss a')
   println 'Formatted Now: ${calendarString}'
}

Date.getDateString (), Date.getTimeString () и Date.getDateTimeString ()

Методы format показанные ранее, позволяют настраивать представление Date или Calendar а методы clearTime показанные ранее, позволяют удалять элемент времени из экземпляра Date или Calendar . Groovy предоставляет некоторые удобные методы для Date для отображения только удобной для пользователя даты, только времени или даты и времени без указания формата или очистки компонента времени. Эти методы печатают даты и время в предопределенном формате, заданном DateFormat.SHORT (для частей даты) и DateFormat.MEDIUM (для частей времени). Далее перечислены списки кодов каждого из этих методов, за которыми следуют снимки экрана с исполняемым кодом.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
/**
 * Demonstrates Groovy's GDK Date.getDateString() method. Note that this
 * method doesn't change the underlying date, but simply presents only the date
 * portion (no time portion is presented) using the JDK's DateFormat.SHORT
 * constant (which defines the locale-specific 'short style pattern' for
 * formatting a Date).
 */
def demoGetDateString()
{
   printTitle('Groovy GDK Date.getDateString()')
   def now = new Date()
   println 'Now: ${now}'
   println 'Date Only: ${now.getDateString()}'
   println 'Now Unchanged: ${now}'
}

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
/**
 * Demonstrates Groovy's GDK Date.getTimeString() method. Note that this
 * method doesn't change the underlying date, but simply presents only the time
 * portion (no date portion is presented) using the JDK's DateFormat.MEDIUM
 * constant (which defines the locale-specific 'medium style pattern' for
 * formatting a Date).
 */
def demoGetTimeString()
{
   printTitle('Groovy GDK Date.getTimeString()')
   def now = new Date()
   println 'Now: ${now}'
   println 'Time Only: ${now.getTimeString()}'
   println 'Now Unchanged: ${now}'
}

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
/**
 * Demonstrates Groovy's GDK Date.getDateTimeString() method. Note that this
 * method doesn't change the underlying date, but simply presents the date and
 * time portions as a String. The date is presented with locale-specific format
 * as defined by DateFormat.SHORT and the time is presented with locale-specific
 * format as defined by DateFormat.MEDIUM.
 */
def demoGetDateTimeString()
{
   printTitle('Groovy GDK Date.getDateTimeString()')
   def now = new Date()
   println 'Now: ${now}'
   println 'Date/Time String: ${now.getDateTimeString()}'
   println 'Now Unchanged: ${now}'
}

Date.parse (String, String)

Класс Date GDK предоставляет метод Date.parse (String, String), который является « вспомогательным методом», который «действует как оболочка для SimpleDateFormat» . Далее следует фрагмент кода и соответствующий снимок экрана с выводом кода, который демонстрирует полезность этого метода.

01
02
03
04
05
06
07
08
09
10
11
12
/**
 * Demonstrate Groovy GDK's Date.parse(String, String) method which parses a
 * String (second parameter) based on its provided format (first parameter).
 */
def demoParse()
{
   printTitle('Groovy GDK Date.parse(String, String)')
   def nowString = '2012-Nov-26 11:45:23 PM'
   println 'Now String: ${nowString}'
   def now = Date.parse('yyyy-MMM-dd hh:mm:ss a', nowString)
   println 'Now from String: ${now}'
}

Date.parseToStringDate (String)

Метод GDK Date.parseToStringDate (String) можно использовать для получения экземпляра Date из String соответствующего точному формату, производимому методом Date.toString() . Другими словами, этот метод может быть полезен для преобразования обратно в Date из String который был сгенерирован из метода toString() Date .

Использование этого метода демонстрируется с помощью следующего фрагмента кода и снимка экрана соответствующего вывода.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
/**
 * Demonstrate Groovy GDK's Date.parseToStringDate(String) method which parses
 * a String generated by a Date.toString() call, but assuming U.S. locale to
 * do this.
 */
def demoParseToStringDate()
{
   printTitle('Groovy GDK Date.parseToStringDate(String)')
   def now = new Date()
   println 'Now: ${now}'
   def nowString = now.toString()
   def nowAgain = Date.parseToStringDate(nowString)
   println 'From toString: ${nowAgain}'
}

Существует один потенциально существенный недостаток метода GDK Date.parseToStringDate(String) . Как говорится в документации, она опирается только на «константы локали США».

Date.toCalendar () и Date.toTimestamp ()

Часто полезно конвертировать java.util.Date в java.util.Calendar или java.sql.Timestamp . Groovy особенно упрощает эти общие преобразования с помощью методов Date.toCalendar и Date.toTimestamp (), предоставленных GDK Date. Они демонстрируются в следующих фрагментах кода, а их вывод отображается на соответствующих снимках экрана.

01
02
03
04
05
06
07
08
09
10
11
12
/**
 * Demonstrates how easy it is to get a Calendar instance from a Date instance
 * using Groovy's GDK Date.toCalendar() method.
 */
def demoToCalendar()
{
   printTitle('Groovy GDK Date.toCalendar()')
   def now = new Date()
   println 'Now: ${now}'
   def calendarNow = now.toCalendar()
   println 'Now: ${calendarNow} [${calendarNow.class}]'
}

01
02
03
04
05
06
07
08
09
10
11
12
/**
 * Demonstrates how easy it is to get a Timestamp instance from a Date instance
 * using Groovy's GDK Date.toTimestamp() method.
 */
def demoToTimestamp()
{
   printTitle('Groovy GDK Date.toTimestamp()')
   def now = new Date()
   println 'Now: ${now}'
   def timestampNow = now.toTimestamp()
   println 'Now: ${timestampNow} [${timestampNow.class}]'
}

Date.updated (Карта) [и Calendar.updated (Карта)]

Последний удобный метод, предоставленный GDK Date который я собираюсь обсудить в этом посте, это Date.updated (Map) , который в документации описывается как «Поддержка создания новой даты, имеющей свойства, аналогичные существующей дате (которая остается неизменной)». но с некоторыми полями, обновленными в соответствии с картой изменений. ‘ Другими словами, этот метод позволяет начинать с определенного экземпляра Date и приобретать другой экземпляр Date такими же свойствами, кроме изменений, указанных в предоставленной Map .

Следующий листинг кода получает новый экземпляр Date из существующего экземпляра Date с несколькими полями, обновленными с использованием Date.updated(Map) . Список кода сопровождается снимком экрана его выполнения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
/**
 * Demonstrate Groovy GDK's Date.updated(Map) with adaptation of the example
 * provided for that method in that method's Javadoc-based GDK documentation.
 * Note that the original Date upon which updated is invoked is NOT mutated and
 * the updates are on the returned instance of Date only.
 */
def demoUpdated()
{
   printTitle('Groovy GDK Date.updated(Map)')
   def now = new Date()
   def nextYear = now[YEAR] + 1
   def nextDate = now[DATE] + 1
   def prevMonth = now[MONTH] - 1
   def oneYearFromNow = now.updated(year: nextYear, date: nextDate, month: prevMonth)
   println 'Now: ${now}'
   println '1 Year from Now: ${oneYearFromNow}'
}

Демонстрация показывает, что исходный экземпляр Date остается неизменным и предоставляется копия с указанными измененными полями. Для GDK Calendar также существует эквивалент Calendar.updated (Map) .

Вывод

В Groovy мне нравятся расширения GDK для классов SDK. В этой статье я рассмотрел, как расширение GDK Date в JDK’s Date предоставляет много полезных вспомогательных методов, которые приводят к более краткому и читабельному коду.

Ссылка: Groovy JDK (GDK): Дата и календарь от нашего партнера JCG Дастина Маркса в блоге Inspired by Actual Events .