Groovy String bis heute

72

Ich codiere das mit Groovy

Ich versuche gerade, eine Zeichenfolge, die ich habe, in ein Datum umzuwandeln, ohne etwas zu langwieriges tun zu müssen.

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

Ausgabe:

Tue Aug 10 16:02:43 PST 2010

Der obige Code funktioniert jedoch einwandfrei, wenn sich meine Zeichenfolge in Folgendes ändert:

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

Es sagt mir, dass "es keinen solchen Wert für Di gibt". Ich habe versucht, ein 'E' in die Analyse für das Datum zu werfen, aber es wurde angegeben, dass das Datum nicht analysiert werden konnte.

Kann jemand erklären, wie ich das zweite Beispiel analysieren soll?

StartingGroovy
quelle
Dies hilft mir: stackoverflow.com/a/17450946/2835520
IgniteCoders

Antworten:

73

Das erste Argument für parse () ist das erwartete Format. Sie müssen das ändern, damit Date.parse("E MMM dd H:m:s z yyyy", testDate)es funktioniert. (Beachten Sie, dass Sie kein neues Datumsobjekt erstellen müssen, es ist eine statische Methode.)

Wenn Sie nicht im Voraus wissen, welches Format Sie haben, müssen Sie dafür eine spezielle Analysebibliothek finden. In Ruby gibt es eine Bibliothek namens Chronic , aber mir ist kein Groovy-Äquivalent bekannt. Bearbeiten : Es gibt einen Java-Port der Bibliothek namens jChronic . Vielleicht möchten Sie ihn auschecken .

Mark Thomas
quelle
5
Ab JDK Version 1.1, ersetzt durch DateFormat.parse (String s)
Alexander Suraphel
9
@ AlexanderSuraphel, es geht eher um Groovy Date, mein Freund.
Adeel Ansari
Ab 2.5.0 gab es jedoch eine bahnbrechende Änderung, und diese Verbesserungen werden nicht mehr mit groovy-all ausgeliefert. In Zukunft müssen sie daher als separates Modul mit dem Namen groovy-dateutil aufgenommen werden. Siehe hier.
Saikat
28

Versuche dies:

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

Hier sind die Muster zum Formatieren der Daten

gcores
quelle
5
Date.parseist veraltet . Verwenden Sie DateFormat.parse()stattdessen.
Cristian Gonçalves
1
Ich weiß , das ist alt, aber Date.parse(String, String)ist nicht in stark veraltet (was die Sprache hier verwendet wird , ist , wenn ich die Frage des Tags zu glauben , bin).
Sensei
Es gibt einen Online-Datumsformat-Tester, den ich als nützlich empfand. Sdfonlinetester.info/#
Cris Rockwell
24

JChronic ist Ihre beste Wahl. Hier ist ein Beispiel, .fromString()das der Date-Klasse eine Methode hinzufügt , die fast alles analysiert, was Sie darauf werfen können:

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

Sie können es so nennen:

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

Date#parseist veraltet . Die Alternative ist:

java.text.DateFormat#parse 

deshalb :

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

Beachten Sie, dass SimpleDateFormat eine Implementierung von DateFormat ist

Abdennour TOUMI
quelle
10
Er verwendet nicht parse (String), sondern parse (Format, Datum), das von groovy not java stammt. Diese Methode ist nicht veraltet.
John Mercier
2
Falsche API-Funktion: Sie erwähnen: Java Date.parse (String), Frage ist über: Groovy Date.parse (String, String), die nicht veraltet ist!
Lospejos
5

Als ich nach groovigen Möglichkeiten suchte, a Stringzu a zu "gießen" Date, stieß ich auf diesen Artikel: http://www.goodercode.com/wp/intercept-method-calls-groovy-type-conversion/

Der Autor verwendet Groovy metaMethods, um das Verhalten einer Klassenmethode dynamisch zu erweitern asType. Hier ist der Code von der Website.

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

Sie bieten eine ConvertKlasse, die die Groovy-Komplexität umschließt und es trivial macht, eine benutzerdefinierte asTypkonvertierung von einem beliebigen Typ zu einem anderen hinzuzufügen :

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

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

Es ist eine bequeme und leistungsstarke Lösung, aber ich würde sie niemandem empfehlen, der nicht mit den Kompromissen und Fallstricken des Bastelns mit MetaClasses vertraut ist.

Doug Paul
quelle
1

Ich denke, der beste einfache Weg in diesem Fall ist die Verwendung von parseToStringDate, das Teil von GDK (Groovy JDK Enhancements) ist:

Analysieren Sie einen String, der dem Muster EEE MMM TT HH: MM: SS ZZJ JJJJ entspricht und nur US-Gebietsschema-Konstanten enthält (z. B. Sa für Samstage). Eine solche Zeichenfolge wird von der toString-Methode von Date generiert

Beispiel:

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

Nachfolgend sehen Sie, wie wir in unserer sich entwickelnden Anwendung vorgehen.

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)

Die Ausgabe sieht aus wie

Sun Nov 11 09:30:31 GMT 2018

In Ihrem Beispiel könnten wir etwas an Ihre Bedürfnisse anpassen. Wenn ich du wäre, würde ich tun:

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)

Ich hoffe das würde dir sehr helfen.

Tung
quelle