2016-05-04 8 views
0

Ich möchte das Datum wie 94 NOV 21 in 94/11/21 konvertieren mit SimpleDateFormat in Java.Vergleichen Sie eine Liste der DateFormats mit eingehenden Datum im String-Format

i erstellt ein einfaches Datumsformat

new SimpleDateFormat("yy MMM dd") 

94 21. November zu analysieren. aber es ist nicht analysierbar, was ist das richtige Muster?

In meinem Code habe ich viele Standardformate des Datums, die ich handhabe, indem ich alle von ihnen in eine Liste (von DateFormats) hinzufüge und das eingehende Datum mit dieser Liste vergleiche und das nicht standardmäßige Datum behandle (R 250051Z FEB 99) innerhalb des Ausnahmeblocks, der gut funktioniert, aber mein Hauptproblem ist, dass ich 94 NOV 21 nicht mit neuem SimpleDateFormat ("yy MMM dd") parsen kann. Die letzte System.out-Anweisung geht zum Ausnahmeblock, aber es sollte mit behandelt werden neues SimpleDateFormat ("yy MMM dd"), aber das funktioniert nicht.

import java.util.List; 
    import java.util.Locale; 
    import java.io.UnsupportedEncodingException; 

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Date; 

import org.apache.commons.codec.binary.Base64; 
import org.apache.commons.lang.StringUtils; 

import java.nio.charset.StandardCharsets; 

import org.apache.commons.lang.StringUtils; 

    public class Test2 { 

    public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    System.out.println(getDate("August 21 99")); 

    System.out.println(getDate("21 August 1999")); 

    System.out.println(getDate("94 NOV 21")); 

    } 

    private static String getDate(String inputString) { 

    if (!StringUtils.isEmpty(inputString)) { 
     String input = inputString.replaceAll("[^A-Za-z0-9 ]", " "); 
     // System.out.println("input to formatter>>" + input); 
     String requiredDate = ""; 
     SimpleDateFormat requiredDateFormat = new   

     SimpleDateFormat("MM/dd/yy"); 

     List<SimpleDateFormat> dateFormats = new  

    ArrayList<SimpleDateFormat>() { 
      { 

       add(new SimpleDateFormat("MMM dd yyyy", Locale.US)); 
       add(new SimpleDateFormat("MMM dd yy", Locale.US)); 
       add(new SimpleDateFormat("yy MMM yy", Locale.US)); 
       add(new SimpleDateFormat("dd MMM yyyy", Locale.US)); 
       add(new SimpleDateFormat("M dd yyyy", Locale.US)); 
       add(new SimpleDateFormat("dd M yyyy", Locale.US)); 
       add(new SimpleDateFormat("dd MM yy", Locale.US)); 
       add(new SimpleDateFormat("MM dd yy", Locale.US)); 
       add(new SimpleDateFormat("M dd yyyy hh mm ss a", 

    Locale.US)); 
       add(new SimpleDateFormat("dd M yyyy hh mm ss a", 
    Locale.US)); 

      } 
     }; 

     Date date = null; 

     for (SimpleDateFormat format : dateFormats) { 
      // System.out.println("in for loop"); 
      try { 
       format.setLenient(false); 
       date = format.parse(input.trim()); 
       if (date != null) { 
        requiredDate =   
    requiredDateFormat.format(date).toString(); 
        break; 
       } 
      } catch (ParseException e) { 

       String day = inputString.subSequence(2, 4).toString(); 
       String monYear = inputString.substring(10); 
       String dateToConvert = day + " " + monYear; 
       SimpleDateFormat customDateFormatter = new SimpleDateFormat("dd MMM yy"); 
       try { 
        date = customDateFormatter.parse(dateToConvert); 
        if (date != null) { 
         requiredDate = requiredDateFormat.format(date).toString(); 
         break; 
        } 

       } catch (Exception ex) { 

        requiredDate = null; 

       } 
       // System.out.println("Handle separately"); 

      } 

     } 

     System.out.println("requiredDate>>>" + requiredDate); 
     return requiredDate; 

    } 

    else { 
     return null; 
    } 
    } 

    } 
+0

Hallo, ich habe meine Frage bearbeitet. – CoderCosmo

Antwort

0

UPDATE:

gut nach dem Code, den Sie aktualisiert sehen dann muss ich rate Ihnen vorwärts Dont comming, Sie verwenden Brute-Force eine bestimmte Zeichenkette in einem Date-Objekt, wich in einigen Fällen zu analysieren kann funktionieren, aber in anderen wird nur Ihre Daten korrumpieren und brechen Sie die Anwendung Loch ...

Stellen Sie sich vor, was passieren kann, wenn dies.

04 12 05 versucht zu analysieren?

ist das 4. Dezember 2005? 12. Mai 2004, 12. April 2005? gut die Antwort ist, ist eine russisch-Roulette, weil Sie die Array-Liste mit mehreren Formatierer iterieren ...

zusammenfassen:

Sie müssen NEED das Datumsformat kennen. Zeitraum.


+1

Warum Spanisch, speziell? –

+0

Ich denke, der Autor meinte, dass eine [romanische Sprache] (https://en.wikipedia.org/wiki/Romance_languages) in Gebrauch war, wobei Spanisch und Französisch Beispiele für romanische Sprachen waren. (Obwohl ich nicht weiß, was mit "ita", "italian" vielleicht gemeint ist?) Das Beispiel von "Nov" kann aus einer von vielen Sprachen stammen, besonders aus den romanischen Sprachen, wie Sie in [dieser Liste der übersetzten Monatsnamen sehen können ] (http://www.omniglot.com/language/time/months.htm). –

+0

Genau ... @basil bourque nicht nur weil die ersten 3 Buchstaben für alle diese Sprachen gleich sind, aber das Format ist fast ein Standard 94Nov21 ... –

0
public class Sample { 
    public static void main(String arg[]) { 
     try{ 
      //94 NOV 21 to 94/11/21 
      SimpleDateFormat sourceDateFormat = new SimpleDateFormat("yy MMM d"); 

      Date date = sourceDateFormat.parse("94 NOV 21"); 


      SimpleDateFormat targetDateFormat = new SimpleDateFormat("yy/M/d"); 
      System.out.println(targetDateFormat.format(date)); 

      }catch(ParseException e){ 
       e.printStackTrace(); 
      } 
    } 
} 

In dem oben genannten Code yy bezeichnet das Jahr heißt die beide letzte Ziffer des Jahres, und MMM bezeichnet den abgekürzten Monat d.h 3 Buchstaben Monat und d, um den Tag des Monats an.

Quelle: https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html enter image description here

+0

Bitte erläutern Sie Ihren Code-Dump. –

+0

Er könnte immer noch ein Problem mit der Sprache haben. Um zu vervollständigen, würde ich ihm zeigen, wie man den Sprachcode einstellt. – tak3shi

1

Ihr Format arbeitet auf Ideone in Ordnung.

Ich vermute, dass Sie in einem nicht englischen Standardgebietsschema arbeiten. Versuchen Sie, das zu analysierende Datum im Gebietsschema USA zu erzwingen:

System.out.println( // Works. 
    new SimpleDateFormat("yy MMM dd", Locale.US).parse("94 NOV 21")); 

System.out.println( // Does not work - expects NOV. (with a period). 
    new SimpleDateFormat("yy MMM dd", Locale.FRANCE).parse("94 NOV 21")); 
+0

Danke für deine Zeit Andy. Aber es hat nicht funktioniert für mich. – CoderCosmo

+0

Ich habe meine Frage aktualisiert können Sie bitte helfen? – CoderCosmo