Frage Verschiedene Datumsformate in einer Zeichenkette in Java analysieren


Ich habe eine Zeichenfolge, die möglicherweise ein Datum in einem der folgenden Formate enthalten kann:

2001-01-05 (yyyy-mm-dd)
2001/01/05 (yyyy/mm/dd)
01/05/2001 (dd/mm/yyyy)
01-05-2001 (dd-mm-yyyy)
2001 january 5
2001 5 january
january 5 2001
5 january 2001
january 5
5 january

Ich möchte in der Lage sein, die bestimmte Zeichenfolge zu analysieren und das Date-Objekt daraus zu extrahieren.

Mein Ansatz war wie folgt:

String[] date_formats = {
                            "yyyy-MM-dd",
                            "yyyyy/MM/dd", 
                            "dd/MM/yyyyy",
                            "dd-MM-yyyy",
                            "yyyy MMM dd",
                            "yyyy dd MMM",
                            "dd MMM yyyy",
                            "dd MMM",
                            "MMM dd",
                            "dd MMM yyyy"};

String output_date = null;
for (String formatString : date_formats)
{
     try
     {    
         Date mydate = new SimpleDateFormat(formatString).parse(token);
         SimpleDateFormat outdate = new SimpleDateFormat("yyyyMMdd");
         output_date = outdate.format(mydate);
         break;
     }
     catch (ParseException e) {
         System.out.println("Next!");
     }
 }

Dies scheint nicht wie erwartet zu funktionieren. Vor allem für Termine wie 5. Januar 2001 usw. Wie gehe ich vor?


5
2017-10-02 12:34


Ursprung


Antworten:


Benutzen SimpleDateFormat.setLenient(false). Auf diese Weise wird nicht versucht, Daten zu analysieren, die nicht genau das gewünschte Format haben.


6
2017-10-02 12:58



Sie müssen alle Formate in der date_formats Array für die Art von Format, das Sie erwarten, würde kommen.

Sieh dir die. An SimpleDateFormat  Javadocs.

Schauen Sie sich die Beispiele in den Javadocs an.

2001-01-05      - yyyy-MM-dd 
2001/01/05      - yyyy/MM/dd
01/05/2001      - dd/MM/yyyy 
01-05-2001      - dd-MM-yyyy 
2001 january 5  - yyyy MMMMM d
2001 5 january  - yyyy d MMMMM
january 5 2001  - MMMMM d yyyy 
5 january 2001  - d MMMMM yyyy
january 5       - MMMMM d
5 january       - d MMMMM

1
2017-10-02 12:40



Anstatt "yyyy-MM-dd", dann "yyyy / MM / dd", dann "yyyy.MM.dd" (in vielen Ländern verwendet) usw. zu testen, können Sie damit beginnen

token = token.replaceAll("-|\\.", "/");

Auf diese Weise werden alle Punkte und Bindestriche durch "/" ersetzt, und Sie können die Anzahl der Formate und Versuche reduzieren.


1
2018-06-23 01:03



Suchst du danach?

String[] date_formats = {
                        "y-M-d",
                        "y/M/d", 
                        "d/M/y",
                        "d-M-y",
                        "y M d",
                        "y d M",
                        "d M y",
                        "d M",
                        "M d",
                        "d M y"};

String output_date = null;
for (String formatString : date_formats)
{
     try
     {    
         SimpleDateFormat sf = new SimpleDateFormat(formatString);  
         output_date = "5 January 2001"; 
         Date yourDate = sf.parse(output_date);
         break;
     }
     catch (ParseException e) {
         System.out.println("Next!");
     }
 }

0
2017-10-02 12:52



Sie können String of Date mit Hilfe von extrahieren

String mydate = new SimpleDateFormat(formatString).format(new Date());

neues Datum() Gibt das Datum des aktuellen Tages zurück. Sie können das Datum jederzeit ändern.

Also, wenn Sie Ihren Code so ändern:

String[] date_formats = {
        "y-M-d",
        "y/M/d", 
        "d/M/y",
        "d-M-y",
        "y M d",
        "y d M",
        "d M y",
        "d M",
        "M d",
        "d M y"};

for (String formatString : date_formats)
    {
        String mydate = new SimpleDateFormat(formatString).format(new Date());
        System.out.println(mydate);
    }

Sie werden mit diesen enden:

2013-10-2
2013/10/2
2/10/2013
2-10-2013
2013 10 2
2013 2 10
2 10 2013
2 10
10 2
2 10 2013

0
2017-10-02 12:52



Fügen Sie dieses Datumsformat hinzu "dd MMMMM YYYY" für "5. Januar 2001"


0
2017-10-02 13:04



SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    String dateInString = formatter.format(date);

    LOG.warn("date in String "+dateInString);

Stellen Sie sicher, dass MM in Kapital ist


0
2018-01-31 05:03



Kayamans Antwort funktioniert, so sieht es in einem Code-Snippet aus, so dass du es einfach selbst testen kannst (direkte Kopie einfügen aus meinem eigenen Code):

static String[] date_formats = {
        "yyyy-MM-dd",
        "yyyy/MM/dd",
        "dd/MM/yyyy",
        "dd-MM-yyyy",
        "yyyy MMM dd",
        "yyyy dd MMM",
        "dd MMM yyyy",
        "dd MMM yyyy"};

static String[] dates = {
        "21/02/2012",
        "21-02-2012",
        "21-2-2012",
        "21 Feb 2012",
        "Feb 21 2012",//will not be parsed
        "21 februari 2012" //Dutch
};

@Test
public void test(){
    for(String date : dates) {
        parseDate(date);
        System.out.print("----------------");
    }
}

private void parseDate(String token){
    Locale dutch = new Locale("nl", "NL");
    for (String formatString : date_formats)
    {
        try
        {
            SimpleDateFormat format = new SimpleDateFormat(formatString, dutch);
            format.setLenient(false);
            Date mydate = format.parse(token);
            System.out.println(mydate.toString());
            break;
        }
        catch (ParseException e) {
            System.out.println("Next!");
        }
    }
}

0
2018-05-10 10:56