Wie würden Sie programmgesteuert ein Muster aus einem Datum erstellen, das in einer Zeichenfolge gespeichert ist?

StackOverflow https://stackoverflow.com/questions/43842

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe eine Zeichenfolge, die die Darstellung eines Datums enthält.Es sieht aus wie:

Do, 30. November 19:00:00 EST 2006

Ich versuche, ein Date-Objekt mit SimpleDateFormat zu erstellen und habe zwei Probleme.

1.) Ich kann das Muster zum Festcodieren der Lösung im SimpleDateFormat-Konstruktor nicht herausfinden

2.) Ich finde keine Möglichkeit, die Zeichenfolge mithilfe der API zu analysieren, um das Muster zu bestimmen, damit ich es für verschiedene Muster der Datumsausgabe wiederverwenden kann

Wenn jemand eine Lösung mit API oder eine benutzerdefinierte Lösung kennt, wäre ich sehr dankbar.

War es hilfreich?

Lösung

Das an SimpleDateFormat zu übergebende Format kann nachgeschlagen werden http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy")

Was Ihre zweite Frage betrifft: Ich kenne keine Java-Bibliothek, die ein Datumsformat herausfinden und analysieren könnte, ohne vorher zu wissen, um welches Format es sich handelt.

Andere Tipps

Der POJava-Datumsparser org.pojava.datetime.DateTime ist ein unveränderlicher und robuster Parser, der mehrere Sprachen, Zeitzonen und Formate unterstützt.

Das Beste daran ist, dass der Parser heuristisch ist und kein bereits vorhandenes „Format“ benötigt, um zu funktionieren.Sie übergeben ihm einfach eine Datums-/Datums-Uhrzeit-Textzeichenfolge und erhalten ein java.util.Date!

Ich bin mir nicht sicher, ob es eine einfache Möglichkeit gibt, ein Datum zu analysieren und sein Muster herauszufinden, aber ich hätte gedacht, dass das Muster für das von Ihnen gepostete Muster so aussehen würde:

EEE MMM dd HH:mm:ss zzz yyyy

Wenn Sie etwas anderes tun möchten als ein Datum zu analysieren oder zu formatieren, gibt es nicht viel, um mit den Mustern selbst umzugehen.Vor einiger Zeit habe ich eine Swing-Komponente zum Eingeben von Daten in ein formatiertes Textfeld geschrieben.Sie haben ein Muster angegeben und es hat den Texteingabecursor durch die Elemente dieses Musters bewegt und nur gültige Werte zugelassen.

Als Teil davon habe ich einen DateFormatParser geschrieben Hier verfügbar als Teil des Open-Source-Projekts OpenHarmonise.

Ein Datum in ein Muster zu zerlegen, wäre ein äußerst interessantes Problem.Sie müssten bestimmte Annahmen treffen (z. B.Gebrauch von :in der Zeit, nicht im Datum), aber Sie stünden vor den ewigen Problemen zweistelliger Jahreszahlen und Tag/Monat- oder Monat/Tag-Anordnungen.

Beachten Sie, dass das von Ihnen angegebene Datumsformat nicht willkürlich ist.Es ist die Ausgabe der integrierten Date.toString()-Methode (zumindest in den Gebietsschemas Großbritannien und USA).Nicht zufällig ist es auch das Format des Unix-Befehls „date“ (zumindest unter Linux, und ich glaube auch an andere Implementierungen) – allerdings füllt Date.toString() einstellige Tageszahlen mit einer Null auf, um pedantisch zu sein Unix-Datum nicht.

Das bedeutet, dass Sie dieses Eingabeformat wahrscheinlich erhalten, wenn Sie ein unformatiertes Datum in ein vom Benutzer änderbares Feld ausgeben (z. B.ein HTML-INPUT-Feld) und erhalten es unverändert zurück.Nur weil Eingaben in diesem Format erfolgen, heißt das nicht, dass die Benutzer tausend andere beliebige Formate eingeben.

Natürlich könnten sie es immer noch tun.Im Allgemeinen gehe ich mit Datumseingaben mit einer Reihe von Try/Catch-Blöcken um, in denen ich es mit einem Format, dann mit einem anderen und dann mit einem anderen versuche.Unser Standard-Framework umfasst jetzt standardmäßig bis zu etwa 20 verschiedene Formate.Natürlich ist es immer noch nicht perfekt;Ich habe neulich jemanden gefunden, der „03. September“ als Datum eingegeben hat (eine nicht standardmäßige Monatsabkürzung und ohne Jahr), und wir hatten dieses Szenario nicht gemeistert.

Siehe Apache Commons' DateUtils.Da ist ein parseDate Methode, die Sie braucht String und mehrere Muster zum Ausprobieren und Ausspucken Date Beispiel.

Wie andere gesagt haben, sieht das Muster so aus, wie es sein sollte

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"

Was das Parsen eines beliebigen Datumsformats angeht, ist mir keine Bibliothek bekannt, die dies in Java tut.Wenn Sie daran interessiert wären, so etwas zu entwickeln, würde ich mir zunächst Perl ansehen str2time Funktion.

Ich muss sagen, dass ich die andere Frage sehr interessant finde.Es gibt jedoch ein ernstes Problem – analysieren Sie Folgendes:07.08.06!Wenn Sie sich auf eine Teilmenge der erwarteten Formate beschränken, könnten Sie das Problem wahrscheinlich lösen, indem Sie mit regulären Ausdrücken herumspielen, eine Reihe erwarteter Muster aufbauen und dann Strings in Leerzeichen oder was auch immer aufteilen und Teil für Teil abgleichen.

Fragen Sie nur nach dem Muster für das angegebene Datum?Wenn ja, denke ich, dass dies reichen sollte:

"EEE MMM d HH:mm:ss z yyyy"

Oder versuchen Sie, ein formatiertes Datum zu nehmen, das Format abzuleiten und es zu analysieren?

Wie wäre es mit:

EEE MMM dd HH:mm:ss zzz yyyy

Übergeben Sie einfach die Zeichenfolge an den Konstruktor von SimpleDateFormat.Um das Objekt zu verwenden, rufen Sie einfach die Parse-Methode auf und übergeben Sie die Zeichenfolge, die Sie in ein Datum konvertieren möchten.

Schauen Sie sich Folgendes an:

http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html

Das ist nicht wirklich dasselbe, aber vielleicht möchten Sie sich so etwas ansehen JChronic, das die Verarbeitung natürlicher Sprache für Datumsangaben durchführen kann.Das Eingabedatum könnte also etwa „morgen“ oder „zwei Wochen ab nächsten Dienstag“ lauten.

Das ist für Ihre Bewerbung vielleicht überhaupt nicht hilfreich, aber vielleicht doch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top