Problem mit Datumsarithmetik(Zeitzonen)



  • Ich stehe vor einem relativ seltsamen Problem und hoffe ihr könnt mir dabei helfen.

    Ich muss für einen Kalender mit versch. Uhrzeiten rechnen. Klingt erstmal recht einfach, da ich ja wunderbar mit dem Unix-Timestamp rechnen kann. Der GregorianCalendar bietet darüber hinaus weitere nette Funktionalitäten, um z. B. die Stunden und Minuten gezielt auszulesen. Dachte ich mir zumindest!

    Zu meiner ersten Frage: Warum muss ich expliziet die Locale auf UTC setzen, damit der GregorianCalendar einwandfrei funktioniert, bzw. warum passt dieser automatisch die Datumswerte an meine Timezone an? Wenn ich 8 Stunden + 30 Minuten rechne, kann es dem Kalender doch egal sein, in welche Zeitzone ich mich bewege? Dieses ungefragte umrechnen finde ich eher verwirrend.

    Zweite Frage: Warum sind alle Werte kleiner als eine Stunde negativ? Damit ist ein vernüftiges rechnen ebenfalls problematisch und ich muss jeden Schritt einzeln über den GregorianCalendar machen.

    Folgender Beispielcode soll das Problem verdeutlichen:

    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.TimeZone;
    
    public class Datum {
    
    	public static void main(String[] args) {
    
    		GregorianCalendar gc = new GregorianCalendar();
    //		gc.setTimeZone( TimeZone.getTimeZone("CET") );
    		gc.setTimeZone( TimeZone.getTimeZone("UTC") );
    		SimpleDateFormat df = new SimpleDateFormat("HH:mm");
    
    		try {
    			Date von = df.parse("08:00");
    			System.out.println("Von: " + von.getTime());
    
    			Date bis = df.parse("15:30");
    			System.out.println("Bis: " + bis.getTime());
    
    			gc.setTimeInMillis(bis.getTime() - von.getTime());
    			System.out.println("Stunden: " + gc.get(GregorianCalendar.HOUR_OF_DAY)
    							+ " Minuten: " + gc.get(GregorianCalendar.MINUTE));
    
    			Date dauer = df.parse("00:15");
    			System.out.println("Dauer: " + dauer.getTime());
    
    			gc.setTimeInMillis(von.getTime() + dauer.getTime());
    
    			System.out.println("Stunden: " + gc.get(GregorianCalendar.HOUR_OF_DAY)
    							+ " Minuten: " + gc.get(GregorianCalendar.MINUTE));
    
    		} catch (ParseException e) {
    			e.printStackTrace();
    		}
    
    	}
    
    }
    

    :xmas1:



  • Calendar.getInstance()?


Anmelden zum Antworten