String zu Date konvertieren -> Unparseable date

turmaline

Bekanntes Mitglied
Hallo Leute,

ich habe hier im Forum viele ähnliche Themen gefunden aber sie haben mir nicht wirklich weiter geholfen.

Mein String sieht folgendermaßen aus: "2010-10-13T12:59:09.930+02:00"
Dies versuche ich in ein Datum umzuwandeln:
Java:
private String getDateFromLongString(String dateString) {
		if (dateString == null || dateString.equals("")) {
			return "";
		}
		//Long dateAsLong = Long.parseLong(dateString);
		//Date date = new Date(dateAsLong);
		String dateFormat = "dd.MM.yyyy HH:mm";
		
		SimpleDateFormat dateFormater = new SimpleDateFormat(dateFormat);
		Date date;
		try {
			date = dateFormater.parse(dateString);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "";
		}
		
		return dateFormater.format(date);
	}

Bei der Ausführung bekomme ich Unparseable date exception.
Hat jemand eine Ahnung wie ich meinen String in ein Datum des gegebenen SimpleDateFormat umwandele?

Danke und Gruß,
madlena
 
Du musst den String selbst parsen und die Werte für Jahr, Monat, Tag, Stunde usw. dann selbst in z.b. ein Calendar oder Date Objekt eintragen.

Damit die *.parse(dateString) Methode funktioniert muss der String eine bestimmte Formatierung haben und meist wird irgendein Wert falsch interpretiert. Wenn dein Date-String immer in dem selben Format ankommt ist es wohl am besten wenn du ihn von Hand parst.

mfg,
krazun
 
Das könnte dann z.B. so aussehen:

Code:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;


public class Test {
    
    public static void main(String[] args) {
        System.out.println(new Test().getDateFromLongString("2010-10-13T12:59:09.930+02:00"));
    }
    
    private String getDateFromLongString(String dateString) {
        if (dateString == null || dateString.equals("")) {
            return "";
        }
        
        String dateFormat = "dd.MM.yyyy HH:mm";
        
        SimpleDateFormat dateFormater = new SimpleDateFormat(dateFormat);
        
        String strDate[];
        String strTime[];
        
        strDate = dateString.substring(0, 10).split("-");
        strTime = dateString.substring(11, 19).split(":");

        Calendar calendar = new GregorianCalendar();
        calendar.setTimeZone(TimeZone.getTimeZone("CET"));
        calendar.set(Calendar.YEAR, Integer.valueOf(strDate[0]));
        calendar.set(Calendar.MONTH, Integer.valueOf(strDate[1]) - 1);
        calendar.set(Calendar.DAY_OF_MONTH, Integer.valueOf(strDate[2]));
        calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(strTime[0]));
        calendar.set(Calendar.MINUTE, Integer.valueOf(strTime[1]));
        calendar.set(Calendar.SECOND, Integer.valueOf(strTime[2]));
        
        return dateFormater.format(calendar.getTime());
    }
}

Ergebnis davon wäre:



mfg,
krazun
 
Zum parsen von Datum/Uhrzeit gibt es die Klasse DateFormat. Ohne es ausprobiert zu haben möchte ich behaupten, dass ich damit das Datum entsprechend parsen kann.
Es sollte aber klar sein, dass ich mit dem Format "dd.MM.yyyy HH:mm" das Datum im Format "2010-10-13T12:59:09.930+02:00" nicht parsen kann.

Ich würde krazuns Lösung nur nehmen, wenn ich für DateFormat nicht ein passendes Format angeben könnte. Und selbst dann würde ich die Logik in eine eigene Format-Klasse packen, die zu dem Mechanismus in Java dann konform ist.
 
Danke für Eure Antworten!

Ein Kollege von mir hat nun Folgendes vorgeschlagen:

Java:
private static final DatatypeFactory _datatypeFactory;
	private static final FastDateFormat _dateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH:mm");
	
	static {
		try {
			_datatypeFactory = DatatypeFactory.newInstance();
		} catch (DatatypeConfigurationException e) {			
			throw new RuntimeException(e);
		}
	}

private String getDateFromString(String dateString) {
		if (dateString == null || dateString.equals("")) {
			return "";
		}
		XMLGregorianCalendar cal = _datatypeFactory.newXMLGregorianCalendar(dateString);
		return _dateFormat.format(cal.toGregorianCalendar());
	}

und das funktioniert.
 

Zurück
Oben