Интересно, есть ли другой способ создания нового Date
в Groovy в определенные даты и время, чем разбор его с String
с помощью метода Date.parse
. Могу ли я получить полный список создания Date
в Groovy?
Как создать новую дату в Groovy в определенные даты и время
Ответ 1
Вы можете использовать существующие методы Java для создания даты:
// takes the date encoded as milliseconds since midnight, January 1, 1970 UTC
def mydate = new Date(System.currentTimeMillis())
// create from an existing Calendar object
def mydate = new GregorianCalendar(2014, Calendar.APRIL, 3, 1, 23, 45).time
Groovy также предоставляет некоторые упрощенные расширения для создания дат. Date.parse()
и Date.parseToStringDate()
разобрать его из строки. Метод Date.copyWith()
строит дату с карты. Вы можете использовать их следующим образом:
// uses the format strings from Java SimpleDateFormat
def mydate = Date.parse("yyyy-MM-dd hh:mm:ss", "2014-04-03 1:23:45")
// uses a format equivalent to EEE MMM dd HH:mm:ss zzz yyyy
def mydate = Date.parseToStringDate("Thu Apr 03 01:23:45 UTC 2014")
def mydate = new Date().copyWith(
year: 2014,
month: Calendar.APRIL,
dayOfMonth: 3,
hourOfDay: 1,
minute: 23,
second: 45)
Ответ 2
Другие ответы устарели от Java 8 и более поздних версий. Старые устаревшие классы времени, такие как java.util.Date/.Calendar/.GregorianCalendar, оказались плохо спроектированными, запутанными и сложными.
java.time
Структура java.time заменяет эти старые классы.
Groovy может использовать эти классы, конечно. Я не знаю синтаксис Groovy, но для этого простого примера Java должен быть легко адаптирован.
LocalDate
/LocalTime
Классы LocalDate
и LocalTime
не имеют понятия о часовом поясе. Поэтому они не представляют фактические моменты на временной шкале.
LocalDate localDate = LocalDate( 2016 , Month.JANUARY , 2 ); // year, month, date.
LocalTime localTime = LocalTime( 12 , 30 , 0 , 0 ); // hour, minute, second, nanosecond.
ZonedDateTime
Примените часовой пояс (ZoneId
), чтобы получить ZonedDateTime
. Используйте имя часового пояса, никогда не отмечаемые сокращения в 3-4 зонах.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.of( localDate , localTime , zoneId );
Instant
Вам следует избегать старых классов времени. Но при необходимости вы можете конвертировать. Instant
- это класс java.time, который представляет момент на временной шкале в формате UTC с разрешением наносекунд. Ищите новые методы для старого класса java.util.Date для преобразования в/из Instant
. Мы можем извлечь необходимый объект Instant
из нашего ZonedDateTime
.
Наносекунда против Миллисекунды
Обратите внимание, что преобразование из java.time связано с потерей данных! Классы java.time поддерживают nanosecond разрешение (до девяти цифр десятичного разряда на дробной секунде), а старый java.util.Date поддерживает только миллисекунды (до трех знаков после запятой). Любая четвертая-девятая цифра дробной секунды усекается. Например, 2016-04-28T02:05:05.123456789
усекается до 2016-04-28T02:05:05.123
.
Instant instant = zdt.toInstant();
java.util.Date utilDate = java.util.Date.from( instant );
Переход в другое направление, от java.util.Date до Instant
. От 4-го до девятого десятичного разряда дробной секунды будут нули, 1-й-3-й для любых миллисекунд.
Instant instant = utilDate.toInstant();
Ответ 3
Насколько я знаю, нет другого пути. Вы также можете передать точное время в миллисе для конструктора класса Date, но сначала вам нужно получить время в миллисеку.
Возможно, эта ссылка будет полезной.
Или этот фрагмент кода:
def calendar = new GregorianCalendar(2011,1,7,15,7,23)
def date = calendar.getTime()
println date
Ответ 4
Groovy хорош.
new Date(2016-1900, 7, 16, 20, 32, 25)
Вт Авг 16 20:32:25 PDT 2016
Обратите внимание, что год должен быть массирован, но вы можете создать новую дату Java, представляющую любую секунду, в которой вы хотите.
Вы можете увидеть больше Groovy Добра на http://mrhaki.blogspot.com/2009/08/groovy-goodness-working-with-dates.html
Ответ 5
Вы можете использовать текущую дату и форматировать ее так, как хотите:
`/*
y: year
m: month
d: day
h: hour
m: minute
*/
Date().format('yyyy-MM-dd hh-mm')
Date().format('yy/mm/dd hh')
И это вернет строку.