如何在特定日期和时间在Groovy中创建新日期

时间:2014-04-03 20:11:39

标签: date groovy

我想知道在特定日期和时间如何在Groovy中创建新的Date,而不是使用String方法从Date.parse解析它。我可以在Groovy中获得Date创建的完整列表吗?

5 个答案:

答案 0 :(得分:44)

您可以使用现有的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()从String解析它。 Date.copyWith()方法从地图构建日期。您可以像这样使用它们:

// uses the format strings from Java's 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)

答案 1 :(得分:6)

从Java 8及更高版本开始,其他答案已过时。旧的遗留日期时间类(例如java.util.Date/.Calendar/.GregorianCalendar)已被证明设计不当,令人困惑且麻烦。

java.time

java.time框架取代了那些旧类。

Groovy当然可以使用这些类。我不知道Groovy语法,但应该很容易适应这个简单的Java示例。

LocalDate / LocalTime

LocalDateLocalTime类没有时区概念。所以它们并不代表时间轴上的实际时刻。

LocalDate localDate = LocalDate( 2016 , Month.JANUARY , 2 ); // year, month, date.
LocalTime localTime = LocalTime( 12 , 30 , 0 , 0 ); // hour, minute, second, nanosecond.

ZonedDateTime

应用时区(ZoneId)以获得ZonedDateTime。使用proper time zone name,而不是常见的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中提取所需的2016-04-28T02:05:05.123456789对象。

纳秒与毫秒

请注意从 java.time转换会导致数据丢失! java.time类支持nanosecond分辨率(在小数秒内最多9位小数位),而旧的java.util.Date仅支持milliseconds(最多3位小数)。小数秒的任何第4到第9位被截断。例如,2016-04-28T02:05:05.123被截断为Instant instant = zdt.toInstant(); java.util.Date utilDate = java.util.Date.from( instant );

Instant

从另一个方向,从java.util.Date到Instant instant = utilDate.toInstant(); 。小数秒的第4到第9个小数位为零,第1个第3个小数位为任意毫秒。

docker run  -v "$PWD":/home -w /home php:5.6-fpm php /home/irc_bot.php

答案 2 :(得分:2)

据我所知,别无他法。您也可以将精确的毫秒时间传递给Date类的构造函数,但首先需要以毫秒计算时间。

也许这link会有所帮助。

或者此代码段:

def calendar = new GregorianCalendar(2011,1,7,15,7,23)
def date = calendar.getTime()
println date

答案 3 :(得分:1)

Groovy很好。

new Date(2016-1900, 7, 16, 20, 32, 25)

2016年8月16日星期二20:32:25

请注意,必须按摩年份,但您可以创建一个代表您想要的任何秒的新Java日期。

您可以在http://mrhaki.blogspot.com/2009/08/groovy-goodness-working-with-dates.html

看到更多Groovy Goodness

答案 4 :(得分:1)

您可以使用Date()获取当前日期,并按照您希望的方式对其进行格式化:

    /*
     y: year
     m: month
     d: day
     h: hour
     m: minute
    */

Date().format('yyyy-MM-dd hh-mm') 
Date().format('yy/mm/dd hh') 

返回类型是一个字符串。