到目前为止的 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”,但它说日期无法被解析。

有人能解释一下我应该如何解析第二个例子吗?

165540 次浏览

试试这个:

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

这是 格式化日期的模式

Parse ()的第一个参数是预期的格式。你必须把它改成 Date.parse("E MMM dd H:m:s z yyyy", testDate)才行。(注意,不需要创建新的 Date 对象,它是一个静态方法)

如果您事先不知道什么格式,那么您必须为此找到一个特殊的解析库。在 Ruby 中有一个名为 慢性的的库,但是我没有发现 Groovy 的等价物。剪辑: 这个库有一个名为 慢性病的 Java 端口,您可能需要查看一下。

J 慢性是你最好的选择。下面的示例将一个 .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")

不推荐使用 Date#parse,另一种选择是:

java.text.DateFormat#parse

因此:

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

注意,SimpleDateFormat 是 DateFormat 的一个实现

在谷歌上搜索 Groovy 将 String“强制转换”为 Date的方法时,我偶然发现了这篇文章: Http://www.goodercode.com/wp/intercept-method-calls-groovy-type-conversion/

作者使用 Groovy 元方法来允许动态扩展任何类的 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

这是一个方便而强大的解决方案,但是我不会向不熟悉如何权衡和修补元类的缺陷的人推荐它。

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

解析匹配模式 EEE MMM dd HH: mm: ss zzz yyyy 的字符串 只包含 US 语言环境常数(例如星期六的 Sat) 字符串由 Date 的 toString 方法生成

例如:

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

下面是我们开发应用程序的方法。

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)

我希望这能对你有所帮助。