到目前为止的Groovy字符串

时间:2010-09-28 23:57:04

标签: string parsing date groovy

我正在使用Groovy

进行编码

我目前正在尝试将我拥有的字符串转换为日期,而不必做任何太繁琐的事情。

String theDate = "28/09/2010 16:02:43";
def newdate = new Date().parse("d/M/yyyy H:m:s", theDate)

输出:

Tue Aug 10 16:02:43 PST 2010

上面的代码工作正常,但是当我的字符串更改为:

String testDate = "Tue Aug 10 16:02:43 PST 2010"
def newerdate = new Date().parse("d/M/yyyy H:m:s", testDate)

它告诉我“周二没有这样的价值”。我试图在日期的解析中抛出一个“E”,但它说日期无法解析。

有人可以解释我应该如何解析第二个例子吗?

7 个答案:

答案 0 :(得分:67)

parse()的第一个参数是预期的格式。您必须将其更改为Date.parse("E MMM dd H:m:s z yyyy", testDate)才能生效。 (注意,您不需要创建新的Date对象,它是一个静态方法)

如果您事先不知道什么格式,则必须为此找到一个特殊的解析库。在Ruby中有一个名为Chronic的库,但我不知道Groovy的等价物。 编辑:库中有一个名为jChronic的Java端口,您可能需要查看它。

答案 1 :(得分:25)

试试这个:

def date = Date.parse("E MMM dd H:m:s z yyyy", dateStr)

以下是patterns to format the dates

答案 2 :(得分:24)

JChronic是您的最佳选择。这是一个向Date类添加.fromString()方法的示例,该方法可以解析您可以抛出的任何内容:

Date.metaClass.'static'.fromString = { str ->
    com.mdimension.jchronic.Chronic.parse(str).beginCalendar.time
}

您可以这样称呼它:

println Date.fromString("Tue Aug 10 16:02:43 PST 2010")
println Date.fromString("july 1, 2012")
println Date.fromString("next tuesday")

答案 3 :(得分:5)

使用Groovy的方法来搜索StringDate,我发现了这篇文章: 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)
            }
        }
    }
}

它们提供了一个包含Groovy复杂性的Convert类,使得从任何类型向任何其他类型添加基于自定义as的类型转换变得微不足道:

Convert.from( String ).to( Date ).using { new java.text.SimpleDateFormat('MM-dd-yyyy').parse(value) }

def christmas = '12-25-2010' as Date

这是一个方便而强大的解决方案,但我不建议那些不熟悉修改metaClasses的权衡和陷阱的人。

答案 4 :(得分:3)

Date#parse已弃用。替代方案是:

java.text.DateFormat#parse 

那里:

 new SimpleDateFormat("E MMM dd H:m:s z yyyy", Locale.ARABIC).parse(testDate)

请注意,SimpleDateFormat是DateFormat

的实现

答案 5 :(得分:0)

我认为在这种情况下最简单的方法是使用parseToStringDate一个Groovy JDK增强功能:

  

解析匹配模式的字符串EEE MMM dd HH:mm:ss zzz yyyy   仅包含US-locale-constants(例如周六周六)。这样的   string由Date

的toString方法生成

示例:

println (Date.parseToStringDate("Tue Aug 10 16:02:43 PST 2010").format('MM-dd-yyyy'))​

希望这有帮助。

答案 6 :(得分:0)

下面是我们正在开发的应用程序中进行操作的方式。

import java.text.SimpleDateFormat

String newDateAdded = "2018-11-11T09:30:31"
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")
Date dateAdded = dateFormat.parse(newDateAdded)

println(dateAdded)

输出看起来像

Sun Nov 11 09:30:31 GMT 2018

在您的示例中,我们可以进行一些调整以满足您的需求。如果我是你,我会做:

String datePattern = "d/M/yyyy H:m:s"
String theDate = "28/09/2010 16:02:43"
SimpleDateFormat df = new SimpleDateFormat(datePattern)
println df.parse(theDate)

我希望这会对您有所帮助。