Timestamp auf volle Einheit abrunden

Fohnbit

Top Contributor
Hallo!

Mir machen die Zeitrechnungen Probleme.
Ich möchte von einem gegeben Zeitstempel auf eine volle Einheit abrunden:
1437256799999L =2015-07-18 23:59:59

Ich möchte nun daraus die Zeit in Millisekunden von:
2015-01-01 00:00:00
2015-07-01 00:00:00
2015-07-18 00:00:00
usw

Klappt alles, bis auf:
2015-01-01 00:00:00

mit dem nachstehenden Code bekomme ich immer:
2015-01-01 01:00:00

Java:
    Calendar cl = Calendar.getInstance();
     cl.setTimeInMillis(1437256799999L);

      cl.set(Calendar.MILLISECOND, 0);
      cl.set(Calendar.SECOND, 0);
      cl.set(Calendar.MINUTE, 0);
      cl.set(Calendar.HOUR, 0);
      cl.set(Calendar.AM_PM, 0);
      cl.set(Calendar.DAY_OF_MONTH, 1);
      cl.set(Calendar.MONTH, 0);

     System.out.println(cl.getTimeInMillis()

Ziehe ich 1h einfach danach ab, paßt es ...
Lasse ich aber "cl.set(Calendar.MONTH, 0);" weg, stimmt die Uhrzeit wieder: 00:00:00

Sieht jemand das Problem?

Danke!
 
Hallo,

ja, aber da bin ich leider nicht weiter gekommen :-(

Ich habe es jetzt mit Joda Time besser lösen können:
Java:
long timestamp = System.currentTimeMillis();

     DateTime firstMinute = new DateTime(timestamp).minuteOfDay()
         .roundFloorCopy();
     DateTime lastMinute = new DateTime(timestamp).minuteOfDay()
         .roundCeilingCopy();

     DateTime firstHour = new DateTime(timestamp).hourOfDay()
         .roundFloorCopy();
     DateTime lastHour = new DateTime(timestamp).hourOfDay()
         .roundCeilingCopy().minusMillis(1);

     DateTime firstDay = new DateTime(timestamp).dayOfMonth()
         .roundFloorCopy();
     DateTime lastDay = new DateTime(timestamp).dayOfMonth()
         .roundCeilingCopy().minusMillis(1);

     DateTime firstMonth = new DateTime(timestamp).monthOfYear()
         .roundFloorCopy();
     DateTime lastMonth = new DateTime(timestamp).monthOfYear()
         .roundCeilingCopy().minusMillis(1);

     DateTime firstYear = new DateTime(timestamp).yearOfCentury()
         .roundFloorCopy().minusHours(1);

     DateTime lastYear = new DateTime(timestamp).yearOfCentury()
         .roundCeilingCopy().minusHours(1).minusMillis(1);

     System.out.println("Minute: " + firstMinute.getMillis() + " "
         + (lastMinute.getMillis() - 1));
     System.out.println("Minute: " + firstMinute + " " + lastMinute);

     System.out.println("Stunde: " + firstHour.getMillis() + " "
         + lastHour.getMillis());
     System.out.println("Stunde: " + firstHour + " " + lastHour);

     System.out.println("Tag: " + firstDay.getMillis() + " "
         + lastDay.getMillis());
     System.out.println("Tag: " + firstDay + " " + lastDay);

     System.out.println("Monat: " + firstMonth.getMillis() + " "
         + lastMonth.getMillis());
     System.out.println("Monat: " + firstMonth + " " + lastMonth);

     System.out.println("Jahr: " + firstYear.getMillis() + " "
         + lastYear.getMillis());
     System.out.println("Jahr: " + firstYear + " " + lastYear);

Aber warum macht er immer noch am Jahresbeginn die Stunde?
Er gibt mir im Beispiel beim Jahr gerundet die TimeZone auf +1 ... statt +2
 
Ich habe immer noch nicht verstanden was du eigentlich willst? Willst du das Datum auch verändert haben oder soll einfach nur die Uhrzeit immer auf 0Uhr des aktuellen Tages gesetzt werden oder soll vor 12Uhr mittags auf 0uhr des aktuellen und nach 12Uhr Mittags auf 0 Uhr des folgenden Tages gesetzt werden?

Gruß

Claus
 
Keine Ahnung, was dein Problem ist. Dein Code-Schnipsel aus dem ersten Beitrag liefert doch genau das gewünschte Ergebnis?!

Ausgabe ist 1420066800000
Was genau dem 01.01.2015 00:00:00 entspricht.
 
Hallo,

Ich muss Messdaten einer Zeitspanne zuteilen.
Daher benötige ich von einem Zeitstempel die Anfang und Endzeit der Zeitspanne.

Die Zeitspanne ist verschieden.
Manchmal exakt alle 15min.
Manchmal exakt 1 Tag.

Daher muss ich den Timestamp auf den gewünschten Anfang der Periode abrunden und aufrunden.

Bei mir hat das Beispiel oben 1h Verschiebung.
Jedoch denk ich das daran die Zeitzone Schuld ist?
 
Was ist denn die Ausgabe in dem von dir im ersten geposteten Code-Schnipsel?

Ich will jetzt nichts hören von wegen "eine Stunde zu viel/zu wenig" oder sonst was, sondern wirklich die exakte Ausgabe.
Kommt da "1420066800000" heraus oder was anderes?
 
Dann versteh ich dein Problem wirklich nicht. Wenn du das nun in ein Datum umrechnest, bekommst du den 01.01.2015 um 00:00:00 CET ... das ist doch genau das, was du willst?!
 
Hallo,

ich denk ich habe nun meinen Gedankenfehler.
Aktuell bekomme ich CEST, da Sommerzeit.
Rufe ich aber ein Datum davor auf, erhalte ich CET.

Aktuell:
2015-07-20T10:49:47.945+02:00

Aber wenn ich nun 5 Monate abziehe, erhalte ich:
2015-02-20T10:50:55.064+01:00

Mich hat eben die "+02:00" und "+01:00" Angaben hinten irritiert, da ich aktuell nur heute und den Anfang des Jahres betrachtet hatte. Dachte es seien 2 verschiedene Zeitzonen.
 

Neue Themen


Zurück
Oben