首页 > 解决方案 > 在不使用静态对象的情况下在 groovy 中严格解析日期时间

问题描述

我正在尝试使用严格/精确解析来解析在 Java 7 上运行的 Groovy 中的日期时间对象。

我尝试使用SimpleDateFormatwith setLenientset tofalse但它仍然过于宽松,例如2018-8-2使用格式解析值yyyy-MM-dd仍然成功(并返回错误的日期)。

我在这里遇到了一个潜在的答案: Java:如何严格解析日期?

但是,出于安全原因,我正在处理的环境不允许我调用静态方法,从而阻止我使用 Joda 的

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

鉴于此限制,如何在 Groovy 中对 DateTime 字符串进行精确/严格解析?

标签: datetimegroovyjodatimestrictexact-match

解决方案


您可以使用DateTimeFormatterBuilderJoda-Time(此处),并使用简单的正则表达式来广泛确认格式。(这里有一个更好的方法,但它使用静态方法。)

完整的例子在这里

考虑:

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')

推荐阅读