Tagesanfang/Ende anhand von long (milliseconds since 1970 Jan 1 0:00 GMT) bestimmen

January

Mitglied
Hallo zusammen.

Gibt es eine Standard-Möglichkeit (die ich bisher nicht gefunden habe) zu einem long-Wert (milliseconds since 1970 Jan 1 0:00 GMT) den Tagesanfang und das Ende zu bestimmen? Ich brauche also sozusagen die Mitternachts-longs zu einem beliebigem long.

Zur Veranschaulichung meiner Frage:
Jetzt gerade sind 1305036641658 Millisekunden sein 1970 vergangen. Wie viele waren es heute als der Tag begann und wie viele werden es sein, wenn der Tag endet?

Ich stehe gerade etwas auf dem Schlauch, vielleicht kann mir ja jemand von euch helfen?
Danke schon im Voraus!
January
 
Hi,

meinst Du sowas:

Java:
Calendar theCalendar = Calendar.getInstance();
		
theCalendar.set(2011, 5, 10, 0, 0, 0);
long timeInMillis = theCalendar.getTimeInMillis();
	
theCalendar.set(2011, 5, 10, 23, 59, 59);
timeInMillis = theCalendar.getTimeInMillis();

Gruß twagi
 
Ist an sich ganz einfach. Evtl. sagt dir ja der Modulo-Operator etwas. Verknüpfst du zwei Zahlen mit dem erhältst du den Rest der übrig bleibt wenn du die erste Zahl durch die zweite teilst. In Java sieht der Operator so aus wie das Prozentzeichen.
Mit 8 % 5 berechnest du also z.B. den Rest den 8 der bei der Ganzzahldivision durch 5 übrig bleibt. Also in diesem Fall 3.

Gut, was hat das jetzt mit dem Datum und Mitternacht zu tun. Ganz einfach:
System.currentMillis() gibt dir die Millisekunden seit Punkt 0 Uhr am 1.1. 1970 zurück.
Nun hat ein Tag genau 24*60*60*1000 Millisekunden. Ist also die aktuelle Zeit ohne Rest durch diese Zahl teilbar, so ist es Mitternacht.
Folgende Methode gibt dir also korrekt zurück ob es gerade Punkt Mitternacht ist:

Java:
public boolean isMidnight(long time) {
    return time % 86400000 == 0;
}
 
Zuletzt bearbeitet von einem Moderator:
Hallo twagi, hallo Technoblade.

Danke erstmal für eure Antworten. Ihr habt mich schon mal in eine neue Richtung gestoßen, auf Modulo hätte ich auch kommen können. Allerdings hat ein Tag leider nicht immer genau 86400000 ms, dank der überflüssigen Sommerzeit :-/ . Ich habe jetzt trotzdem versucht, zwei Methoden zu schreiben, die mir den Tag-Anfang und das Tag-Ende als long liefern (das sind die Methoden die ich brauche):

Java:
package test;

import java.sql.Date;
import java.sql.Time;

public class TagesGrenze {

	public static void main(String[] args) {
		long anzeigeVon = tagStart(System.currentTimeMillis());
		System.out.println(new Date(anzeigeVon));
		System.out.println(new Time(anzeigeVon));
		long anzeigeBis = tagEnde (System.currentTimeMillis());
		System.out.println(new Date(anzeigeBis));
		System.out.println(new Time(anzeigeBis));

	}

	private static long tagEnde(long zeitPunkt) {
		long bisMitternacht = 86400000 -(zeitPunkt % 86400000);
		return zeitPunkt + bisMitternacht;
	}

	private static long tagStart(long zeitPunkt) {
		long heuteVergangen = zeitPunkt % 86400000;
		return zeitPunkt - heuteVergangen;
	}
}

Als Ergebnis kommt allerdings das hier raus:
2011-05-10
02:00:00
2011-05-11
02:00:00

Ich schätze mal, die +2Stunden kommen von der +1Zeitzone und der Sommerzeit. Vielleicht kann mir ja jemand noch in der Richtung helfen, kann auch sein, dass ich Date und Time falsch verwende...

Danke!
January
 
Wir hatten hier erst vor ein paar Tagen einen Thread in dem es darum ging von einer gegebenen Zeit die Zulu-Zeit *also GMT* herauszubekommen. Müsstest du gleich auf der Seite finden. Bau das dann noch in deinen Code ein und es sollte die Lösung sein.
 
Danke für eure Hilfe! Jetzt klappt es so wie ich mir das vorstelle.

Falls noch jemand dran interessiert ist:
Java:
private long tagEnde(long zeitPunkt) {
		
		long bisMitternacht = 86400000 -(zeitPunkt % 86400000) - 3600000 ; //GMT
		
		Calendar zeitpunkt = Calendar.getInstance();
		zeitpunkt.setTimeInMillis(zeitPunkt);
		if (zeitpunkt.getTimeZone().inDaylightTime(zeitpunkt.getTime())){
			bisMitternacht -= 3600000; // Sommerzeit
		}
		
		return zeitPunkt + bisMitternacht;
	}

	private long tagStart(long zeitPunkt) {
		long heuteVergangen = zeitPunkt % 86400000 + 3600000 ; //GMT
		Calendar zeitpunkt = Calendar.getInstance();
		zeitpunkt.setTimeInMillis(zeitPunkt);
		if (zeitpunkt.getTimeZone().inDaylightTime(zeitpunkt.getTime())){
			heuteVergangen += 3600000; // Sommerzeit
		}
		return zeitPunkt - heuteVergangen;
	}
 
Ich würde das einfach nur mit dem Calendar-Objekt machen oder mit der besseren JodaTime Library.
Java:
Calendar start = Calendar.getInstance();
start.set(Calendar.HOUR_OF_DAY, 0);
start.set(Calendar.MINUTES, 0);
start.set(Calendar.SECONDS, 0);
start.set(Calendar.MILLISECONDS, 0);
System.out.println(start.getTime());
System.out.println(start.getTimeInMillis());
//Hat nun Zeitstempel  von 0 Uhr
start.add(Calendar.DAY_OF_MONTH, 1);//ein Tag dazu addieren
System.out.println(start.getTime());
System.out.println(start.getTimeInMillis());

Alles ohne IDE geschrieben, daher könnten noch Compiler-Fehler vorhanden sein.
 
Zurück