Wie um zu überprüfen, die Gültigkeit von Datums-String?
In mein Projekt, ich brauche, um zu überprüfen, ob ein Datum-string auswertet, zu einem richtigen Date-Objekt. Ich habe entschieden zu erlauben, yyyy-MM-dd, und Datum-Formate [(Jahr, Monat, Datum) (Jahr, Monat, Tag, STD, min)]. Wie kann ich prüfen, ob Sie gültig sind ? Mein code gibt null für "1980-01-01" und einige seltsame Daten (wie 3837.05.01) whon geben einen string, getrennt durch Kommas :
private Date parseDate(String date){
Date data = null;
//yyy-mm-dd
try {
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
df.setLenient(false);
df.parse(date);
return data;
}
catch (Exception e) {
try{
int[] datArr = parseStringForDate(date);
int len = datArr.length;
//year, month, day
if(len == 3){
return new Date(datArr[0], datArr[1], datArr[2]);
}
//year, montd, day, hours, mins
else if(len ==5){
return new Date(datArr[0], datArr[1], datArr[2], datArr[3], datArr[4]);
}
//year, month, day, hours, mins, secs
else if(len == 6){
return new Date(datArr[0], datArr[1], datArr[2], datArr[3], datArr[4], datArr[5]);
}
else {
return data;
}
}
catch (Exception f){
return data;
}
}
}
private int[] parseStringForDate(String s){
String[] sArr = s.split(",");
int[] dateArr = new int[sArr.length];
for(int i=0; i< dateArr.length; i++){
dateArr[i] = Integer.parseInt(sArr[i]);
}
return dateArr;
}
Ich erinnere mich, dass ich hatte, um zu subtrahieren 1900 von Jahr Datum, aber ich sehe auch, dass Monat ist anders etc, und ich möchte vermeiden, überprüfen Sie jedes element meines Arrays mit int-Werten, die aus den Datums-string. Ist es möglich zu analysieren, die Sie automatisch in Kalender-oder date-Objekt ?
- Herzlich willkommen auf Stack Overflow! Diese lösen nicht dein problem direkt, aber du bist mit try-catch-Blöcke zu implementieren, Ihre Logik, und Sie können finden, die Dinge werden klarer, wenn Sie behalten uns Ausnahmen bei außergewöhnlichen Bedingungen.
- Mehr relevant zu deinem problem: was ist yyy-mm-dd format? Würde "999-10-10" bedeutet, Oktober 10, 1999? Oder Oktober 10, 999? Oktober 10, 2099?
- Hoppla, es sollte yyyy
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie konstruieren "=SimpleDateFormat Objekte für Ihre verschiedenen String-Formate wie dieses (Rückkehr
null
wenn der parameter nicht analysiert werden, wie ein gültiges Datum):for (Format f: possibleFormat) { ... }
) statt alle, die while-Schleife Logik.2010-14-24
(zurückFeb. 24, 2011
) - " = SimpleDateFormat gesetzt werden muss, nicht nachsichtig.break
.Sie tun dies der falsche Weg. Sie verwenden sollten,"=SimpleDateFormat.
null
auf Fehler.Für alle knallen durch die im Jahr 2017 oder später, hier ist das Java-8-Lösung:
Mit
DateTimeFormatter
können Sie sicher lassen Sie das array der Formatierer werden statisch, auch in einer Multithreading-Umgebung: im Gegensatz zuSimpleDateFormat
eineDateTimeFormatter
ist thread-sicher.Einen
LocalDate
ist ein Datum ohne Zeit, also, wenn irgendwelche Stunden und Minuten waren in der Zeichenfolge, sind Sie verloren. Um die Stunden, Minuten und Sekunden müssen Sie auch eineLocalDateTime
, und dann müssen Sie ein paar Tricks, um die Analyse der Arbeit in den Fällen, in denen keine Stunden und Minuten in der Zeichenfolge. Sie können entweder versuchen, beideLocalDate.parse()
undLocalDateTime.parse()
oder erstellen Sie vielleicht einen Formatierer hat einen Standard für Stunden zu verwenden, wenn Sie nicht in der Zeichenfolge.DateTimeFormatterBuilder
tun kann.Nur um zu zeigen das Endergebnis, Dank Csaba_H und Steve Kuo.