Sta*_*ovy 69 string groovy parsing date
我正在用Groovy编写代码
我目前正在尝试将我拥有的字符串转换为日期,而不必做任何太繁琐的事情.
String theDate = "28/09/2010 16:02:43";
def newdate = new Date().parse("d/M/yyyy H:m:s", theDate)
Run Code Online (Sandbox Code Playgroud)
输出:
Tue Aug 10 16:02:43 PST 2010
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常,但是当我的字符串更改为:
String testDate = "Tue Aug 10 16:02:43 PST 2010"
def newerdate = new Date().parse("d/M/yyyy H:m:s", testDate)
Run Code Online (Sandbox Code Playgroud)
它告诉我"周二没有这样的价值".我试图在日期的解析中抛出'E',但它说日期无法解析.
有人可以解释我应该如何解析第二个例子?
Mar*_*mas 72
parse()的第一个参数是预期的格式.你必须改变它才能Date.parse("E MMM dd H:m:s z yyyy", testDate)使它工作.(注意,您不需要创建新的Date对象,它是一个静态方法)
如果您事先不知道什么格式,则必须为此找到一个特殊的解析库.在Ruby中有一个名为Chronic的库,但我不知道Groovy的等价物.编辑:库中有一个名为jChronic的Java端口,您可能需要查看它.
gco*_*res 26
试试这个:
def date = Date.parse("E MMM dd H:m:s z yyyy", dateStr)
Run Code Online (Sandbox Code Playgroud)
ata*_*lor 24
JChronic是您的最佳选择.这是一个.fromString()向Date类添加一个方法的示例,该方法可以解析您可以抛出的任何内容:
Date.metaClass.'static'.fromString = { str ->
com.mdimension.jchronic.Chronic.parse(str).beginCalendar.time
}
Run Code Online (Sandbox Code Playgroud)
你可以这样称呼它:
println Date.fromString("Tue Aug 10 16:02:43 PST 2010")
println Date.fromString("july 1, 2012")
println Date.fromString("next tuesday")
Run Code Online (Sandbox Code Playgroud)
Date#parse已弃用。替代方案是:
java.text.DateFormat#parse
Run Code Online (Sandbox Code Playgroud)
所以 :
new SimpleDateFormat("E MMM dd H:m:s z yyyy", Locale.ARABIC).parse(testDate)
Run Code Online (Sandbox Code Playgroud)
谷歌搜索Groovy的方法来"转换" String到a Date,我看到了这篇文章:http:
//www.goodercode.com/wp/intercept-method-calls-groovy-type-conversion/
作者使用Groovy metaMethods来动态扩展任何类asType方法的行为.这是网站上的代码.
class Convert {
private from
private to
private Convert(clazz) { from = clazz }
static def from(clazz) {
new Convert(clazz)
}
def to(clazz) {
to = clazz
return this
}
def using(closure) {
def originalAsType = from.metaClass.getMetaMethod('asType', [] as Class[])
from.metaClass.asType = { Class clazz ->
if( clazz == to ) {
closure.setProperty('value', delegate)
closure(delegate)
} else {
originalAsType.doMethodInvoke(delegate, clazz)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它们提供了一个Convert包含Groovy复杂性的类,使得as从任何类型向任何其他类型添加基于自定义的类型转换变得微不足道:
Convert.from( String ).to( Date ).using { new java.text.SimpleDateFormat('MM-dd-yyyy').parse(value) }
def christmas = '12-25-2010' as Date
Run Code Online (Sandbox Code Playgroud)
这是一个方便而强大的解决方案,但我不建议那些不熟悉修改metaClasses的权衡和陷阱的人.