在不使用静态对象的情况下严格解析 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 的 DateTimeFormatterBuilder
(here), 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')
我正在尝试使用 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 的 DateTimeFormatterBuilder
(here), 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')