2009-09-18 8 views

Antwort

4

Es ist wahrscheinlich am einfachsten, um die Quellzeichenfolge in eine kanonische Format "zwicken":

if (text.length() == 16) 
{ 
    if ((text.charAt(2) == '/' && text.charAt(5) == '/') || 
     (text.charAt(2) == '.' && text.charAt(5) == '.')) 
    { 
     text = text.substring(0, 2) + "-" + text.substring(3, 5) 
      + "-" + text.substring(6); 
    } 
} 

dann den Format-String verwenden, mit "-".

Beachten Sie, dass dies sehr spezifisch ist, nur genau die Zeichen ersetzen, die Sie interessieren, um unerwünschte Nebenwirkungen zu vermeiden.

+0

Danke, ich werde anfangen, an einem generischen Datums-Parser für unsere Codebasis zu arbeiten und das wird ein guter Anfang sein – Tarski

5

Können Sie zwei Operationen zuerst ersetzen laufen, so dass Sie alle drei Formate auf ein einziges reduzieren?

+0

Ah .. Ich habe diese nicht vor dem Posten meiner Antwort +1 gesehen. groß! – vpram86

-3

ParseExact kann eine Reihe von Formaten annehmen. Sie müssen noch alle Formate angeben, aber es ist eine einzelne Operation.

+2

Das ist eine Java-Frage, es gibt keine parseExact-Methode – Tarski

+0

, die keine Methode von SimpleDateFormat oder dem Standard ist Fall für eine Java-Methode. Beziehen Sie sich auf C# oder ähnliches? –

+0

Entschuldigung, mein Fehler. Ja, das ist C#. –

4

Sie Apache commons lang DateUtils.parseDate verwenden

import java.text.ParseException; 
import org.apache.commons.lang.time.DateUtils; 

public class Test { 

public static void main(String[] args) throws ParseException { 

    String[] values = new String[]{"31-12-2009 12:00", "31/12/2009 12:00", "31.12.2009 12:00"}; 
    String[] parsePatterns = new String[]{"dd-MM-yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd.MM.yyyy HH:mm"}; 

    for (String value : values) { 
     System.out.println(DateUtils.parseDate(value, parsePatterns)); 
    } 
} 
} 

Nun, intern schafft es SimpleDateFormats, aber was ist daran falsch?

1

wie über einen regulären Ausdruck:

"\\d\\d[./-]\\d\\d[./-]\\d\\d\\d\\d \\d\\d:\\d\\d" 

Im Code würde dies so etwas wie dies bedeuten:

Pattern pattern = 
Pattern.compile("(\\d\\d)([./-])(\\d\\d)([./-])(\\d\\d\\d\\d) (\\d\\d):(\\d\\d)"); 

Matcher matcher = 
pattern.matcher("31-07-1983 15:30"); 

if (matcher.find() && matcher.group(2).equals(matcher.group(4))) { 
    int day = Integer.parseInt(matcher.group(1)); 
    int month = Integer.parseInt(matcher.group(3)); 
    int year = Integer.parseInt(matcher.group(5)); 
    int hour = Integer.parseInt(matcher.group(6)); 
    int minute = Integer.parseInt(matcher.group(7)); 
} 
+0

Da \ ein Escape-Zeichen in Java-String-Literalen ist, müssten Sie jedes \: "\\ d \\ d [\\. \\/\\ -] \\ d \\ d [\\. \ \/\\ -] \\ d \\ d \\ d \\ d \\ d \\ d: \\ d \\ d \ " – Jesper

+0

Sie irren sich - Sie müssten immer noch" \\ d "in Ihrem schreiben Java-Quellcode, unabhängig davon, ob es sich um einen regulären Ausdruck handelt oder nicht. – Jesper

+0

Jetzt musste ich gehen und überprüfen, Sie haben absolut Recht, Sir. Das ist höllisch hässlich, sie hätten so einfach einen anderen Fluchtcharakter benutzen können. – NomeN

0

es, sich mit einem regulären Ausdruck Doing:

public class SpecialDateFormat 
{ 
    private final static Pattern PATTERN = Pattern.compile("(\\d{2})[\\.\\/\\-](\\d{2})[\\.\\/\\-](\\d{4}) (\\d{2}):(\\d{2})"); 

    public static Date parse(String text) throws ParseException { 
     Matcher m = PATTERN.matcher(text); 
     if (m.matches()) { 
      int dd = Integer.parseInt(m.group(1)); 
      int mm = Integer.parseInt(m.group(2)); 
      int yy = Integer.parseInt(m.group(3)); 
      int hh = Integer.parseInt(m.group(4)); 
      int mi = Integer.parseInt(m.group(5)); 

      // NOTE: Checking if values are in valid ranges omitted 

      Calendar cal = Calendar.getInstance(); 
      cal.set(yy, mm - 1, dd, hh, mi, 0); 

      return cal.getTime(); 
     } 
     else { 
      throw new ParseException("Unparseable date: " + text, 0); 
     } 
    } 
} 

ist jedoch zu beachten, dass dies erlaubt das Mischen verschiedener Separatoren, z "17-09/2009 12:00" wäre erlaubt.

+0

ich nenne das eklatante stehlen des konzepts ;-), du wirst sehen, dass ich in der unterschiedlichen separator-prüfung mit wenig anstrengung gearbeitet habe. – NomeN

+0

Und anscheinend müssen Sie keinen der Charaktere zwischen den [] entkommen, nicht einmal die Periode. – NomeN