web-dev-qa-db-ja.com

これまでの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」をスローしようとしましたが、日付を解析できないと言われました。

誰かが2番目の例を解析する方法を説明できますか?

66
StartingGroovy

Parse()の最初の引数は、予期される形式です。動作させるには、Date.parse("E MMM dd H:m:s z yyyy", testDate)に変更する必要があります。 (新しいDateオブジェクトを作成する必要はありません。これは静的メソッドです)

事前にどの形式かわからない場合は、そのための特別な解析ライブラリを見つける必要があります。 Rubyには Chronic と呼ばれるライブラリがありますが、Groovyに相当するものは知りません。 EditjChronic と呼ばれるライブラリのJavaポートがあります。チェックすることをお勧めします。でる。

71
Mark Thomas

これを試して:

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

日付をフォーマットするパターン

26
gcores

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

StringDateに「キャスト」するGroovyの方法を探し回って、この記事に出会いました: 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をいじくり回すことのトレードオフと落とし穴に精通していない人にはお勧めしません。

5
Doug Paul

Date#parseは非推奨です。代替手段は次のとおりです。

Java.text.DateFormat#parse 

フォア:

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

SimpleDateFormatはDateFormatの実装であることに注意してください

3
Abdennour TOUMI

この場合の最も簡単な方法は parseToStringDate を使用することだと思います。これはGroovy JDKの機能強化の1つです。

USロケール定数のみを含むパターン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
bitsnaps

以下は、開発中のアプリケーション内での方法です。

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)

これがお役に立てば幸いです。

0
Tung