Frage

Was ist die schönste Art, um ein Datum zu analysieren, die in einem der folgenden Formate sein kann

 "dd-MM-yyyy HH:mm"
 "dd/MM/yyyy HH:mm"
 "dd.MM.yyyy HH:mm"

3 ohne SimpleDateFormats Erstellen und Parsen gegen jeden.

Danke

War es hilfreich?

Lösung

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

Verwenden Sie dann den Format-String mit "-"

.

Beachten Sie, dass diese sehr spezifisch ist, nur zu ersetzen genau die Zeichen, die Sie interessiert sind, unerwünschte Nebenwirkungen zu vermeiden.

Andere Tipps

Könnten Sie laufen zwei Operationen zuerst ersetzen, so dass Sie alle drei Formate auf einen einzigen reduzieren?

Sie verwenden Apache commons lang DateUtils.parseDate

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 SimpleDateFormats, aber was ist daran falsch?

, wie etwa eine regex:

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

Code so etwas wie dies bedeuten würde:

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

Tun Sie es sich mit einem regulären Ausdruck:

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

Beachten Sie jedoch, dass dies nicht erlaubt Mischen verschiedene Separatoren, z.B. "17-09 / 2009 00.00" würde erlaubt werden.

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

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