Groovy字符串至今


72

我正在用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)

它告诉我,“ Tue没有这样的价值”。我试图在日期的解析中添加“ E”,但该日期无法解析。

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


Answers:


73

parse()的第一个参数是预期的格式。您必须将其更改Date.parse("E MMM dd H:m:s z yyyy", testDate)为起作用。(请注意,您无需创建新的Date对象,这是一个静态方法)

如果您事先不知道哪种格式,则必须为此找到一个特殊的解析库。在Ruby中,有一个名为Chronic的库,但是我不了解Groovy的等效项。编辑:有一个名为jChronic的库的Java端口,您可能想签出。


5
从JDK 1.1版开始,由DateFormat.parse(String s)取代
Alexander Suraphel

9
@AlexanderSuraphel,它是关于Date我的朋友Groovy的。
阿黛尔·安萨里

但是,从2.5.0版开始,发生了重大变化,而所有增强功能不再随groovy-all一起提供。因此,今后,它们需要作为一个单独的模块包含在内,名为groovy-dateutil。看这里。
赛卡特


24

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

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

5

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

java.text.DateFormat#parse 

前面:

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

请注意,SimpleDateFormat是DateFormat的实现。


10
他没有使用parse(String),而是使用了来自groovy而不是Java的parse(format,date)。不建议使用此方法。
John Mercier

2
错误的API函数:您提到了:Java Date.parse(String),问题是关于:Groovy Date.parse(String,String),这是不建议使用的!
lospejos

5

搜寻有关Groovy的“将aString转换为” 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)
            }
        }
    }
}

它们提供了一个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

这是一种方便且功能强大的解决方案,但对于不熟悉metaClasses的权衡和陷阱的人,我不会推荐它。


1

我认为在这种情况下,最好的简单方法是使用parseToStringDate,它是GDK(Groovy JDK增强功能)的一部分:

解析一个与仅包含美国语言环境常量的模式EEE MMM dd HH:mm:ss zzz yyyy匹配的字符串(例如,星期六为星期六)。这样的字符串是由Date的toString方法生成的

例:

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

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)

希望对您有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.