datetime - 在不使用静态对象的情况下在 groovy 中严格解析日期时间
问题描述
我正在尝试使用严格/精确解析来解析在 Java 7 上运行的 Groovy 中的日期时间对象。
我尝试使用SimpleDateFormat
with setLenient
set tofalse
但它仍然过于宽松,例如2018-8-2
使用格式解析值yyyy-MM-dd
仍然成功(并返回错误的日期)。
我在这里遇到了一个潜在的答案: Java:如何严格解析日期?
但是,出于安全原因,我正在处理的环境不允许我调用静态方法,从而阻止我使用 Joda 的
DateTimeFormat.forPattern("yyyy-MM-dd")
鉴于此限制,如何在 Groovy 中对 DateTime 字符串进行精确/严格解析?
解决方案
您可以使用DateTimeFormatterBuilder
Joda-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')
推荐阅读
- java - 正则表达式没有从模式中删除下划线
- apache-kafka - Spring Cloud Stream Kafka Stream 加入后未写入目标主题
- javascript - 在数组中搜索对象
- android - 是否可以从 Fabric 迁移到 Firebase Crashlytics 中删除 Fabric apiKey?
- google-cloud-storage - gsutil 是否支持从 Azure 存储复制文件?
- c# - 调用 Deserialize 方法时,Jil 是否可以选择将空字符串转换为 null?
- sql-server - SQL Server PATINDEX 有时会返回错误的找到索引
- regex - 如何创建正确的 RegEx 模式来识别“,”(或之前和之后)之间的值?
- c - C: 通过 HTTP 请求将文件上传到 Google Drive 的错误 408 响应
- c++ - 未计算上下文中的 lambdas (C++20 前)