在不使用静态对象的情况下严格解析 groovy 中的日期时间

Strict parsing date time in groovy without using static objects

我正在尝试使用 strict/exact 解析在 Java 7 上解析 Groovy 运行 中的日期时间对象。

我试过使用 SimpleDateFormat 并将 setLenient 设置为 false 但它仍然太宽松,例如使用格式 yyyy-MM-dd 解析值 2018-8-2 仍然成功(并且 returns 错误的日期)。

我在这里遇到了一个可能的答案: Java: How to parse a date strictly?

但是出于安全原因,我正在使用的环境不允许我调用静态方法,这使我无法使用 Joda 的

DateTimeFormat.forPattern("yyyy-MM-dd")

鉴于此限制,我如何对 Groovy 中的 DateTime 字符串进行 exact/strict 解析?

您可以使用来自 Joda-Time 的 DateTimeFormatterBuilderhere), with a simple regex to broadly confirm the format. (There is a better way here 但它使用静态方法。)

完整示例 here.

考虑:

def getDateTime(def s) {
    def result = null

    def regex = /^\d\d\d\d-\d\d-\d\d$/

    if (s ==~ regex) {
        // yyyy-MM-dd
        def formatter = new DateTimeFormatterBuilder()
                             .appendYear(4,4)
                             .appendLiteral('-')
                             .appendMonthOfYear(2)
                             .appendLiteral('-')
                             .appendDayOfMonth(2)
                             .toFormatter()
        try {
            result = formatter.parseDateTime(s)
        } catch (Exception ex) {
            // System.err.println "TRACER ex: " + ex.message
        }
    }

    return result
}

用法:

assert new DateTime(2018,8,2,0,0) == getDateTime('2018-08-02')
assert null == getDateTime('18-08-02')
assert null == getDateTime('2018-8-02')
assert null == getDateTime('2018-08-2')