【问题标题】:How to create new Date in Groovy at specific date and time如何在特定日期和时间在 Groovy 中创建新日期
【发布时间】:2014-04-03 20:11:39
【问题描述】:

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

【问题讨论】:

    标签: date 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'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)
    

    【讨论】:

    • 哇不错,也是迄今为止我见过的最易读的一个。如果您可以完成创建Date 的其他可能方式,我一定会接受您的回答。
    • 这是另一种方式。 set()def mydate = new Date(); mydate.set(year: 2014, month: Calendar.APRIL, dayOfMonth: 3, hourOfDay: 1, minute: 23, second: 45)@michal.kreuzman
    • 好点@dmahapatro。那个的优点是不创建额外的 Date 对象。太糟糕了,它没有返回 Date 对象,所以它不能用作初始化器。
    • 同意。这就是为什么没有添加为您的答案的更新。 ;) copyWith()set() 更合适。
    • 已弃用,查看 Basil Bourque 答案
    【解决方案2】:

    其他答案在 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。我们可以从 ZonedDateTime 中提取所需的 Instant 对象。

    纳秒 vs 毫秒

    请注意,从 java.time 转换会导致数据丢失! java.time 类支持nanosecond 分辨率(小数秒最多9 位小数),而旧的java.util.Date 仅支持milliseconds(最多3 位小数)。小数秒的任何第 4 到第 9 位都会被截断。例如,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 到第 9 位小数为零,第 1 到第 3 位为任何毫秒。

    Instant instant = utilDate.toInstant();
    

    【讨论】:

      【解决方案3】:

      Groovy 很好。

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

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

      请注意,必须修改年份,但您可以创建一个新的 Java 日期来表示您想要的任何秒数。

      您可以在 http://mrhaki.blogspot.com/2009/08/groovy-goodness-working-with-dates.html 看到更多 Groovy Goodness

      【讨论】:

        【解决方案4】:

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

            /*
             y: year
             m: month
             d: day
             h: hour
             m: minute
            */
        
        Date().format('yyyy-MM-dd hh-mm') 
        Date().format('yy/mm/dd hh') 
        

        返回类型是一个字符串。

        【讨论】:

          【解决方案5】:

          据我所知,没有其他办法。您还可以将精确的毫秒时间传递给 Date 类的构造函数,但首先您需要以毫秒为单位获取时间。

          也许这个link 会有所帮助。

          或者这个代码sn-p:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-11-23
            • 2020-04-28
            • 2018-10-03
            • 1970-01-01
            • 2012-10-19
            • 2012-05-27
            • 2012-12-10
            相关资源
            最近更新 更多