1. 概述

在这篇简短的教程中,我们将学习如何在 Groovy 中将表示日期的 String 转换为真正的 Date 对象。

不过需要提醒的是,Groovy 是 Java 的增强版,因此我们不仅可以使用所有传统的 Java 方法,还可以使用 Groovy 提供的新特性来简化操作。

2. 使用 DateFormat

首先,我们依然可以像在 Java 中那样使用 DateFormat 来解析字符串:

def pattern = "yyyy-MM-dd"
def input = "2019-02-28"

def date = new SimpleDateFormat(pattern).parse(input)

不过 Groovy 提供了一个更简洁的方式:它将这种行为封装在了静态方法 Date.parse(String format, String input)

def date = Date.parse(pattern, input)

这个方法本质上是对 java.util.Date 的扩展,每次调用时都会内部实例化一个 java.text.DateFormat 对象,以保证线程安全。

2.1. 版本兼容性问题

⚠️ 注意:Date.parse(String format, String input) 方法从 Groovy 1.5.7 版本开始提供。

✅ Groovy 2.4.1 引入了一个支持时区的重载版本:Date.parse(String format, String input, TimeZone zone)

❌ 但从 Groovy 2.5.0 开始,出现了破坏性变更,这些扩展不再包含在 groovy-all 中。

因此,从 2.5.0 起,如果你需要使用这些功能,需单独引入模块 groovy-dateutil

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-dateutil</artifactId>
    <version>2.5.6</version>
</dependency>

📌 另外,Groovy 3.0.0 也提供了该功能,但目前仍处于 Alpha 阶段。

3. 使用 JSR-310 的 LocalDate

从 Java 8 开始,引入了全新的日期时间 API —— Date/Time API,它在很多方面都优于旧的日期类(如 DateCalendar),应该优先使用。

在 Groovy 中也可以很方便地使用 java.time.LocalDate 来解析日期字符串:

def date = LocalDate.parse(input, pattern)

4. 总结

我们已经了解了在 Groovy 中如何将 String 转换为 Date,并注意到了不同版本之间的差异和兼容性问题。

一如既往,本文的源码和单元测试可以在 GitHub 上找到。


原始标题:Converting a String to a Date in Groovy