Datumsproblem

Status
Nicht offen für weitere Antworten.

myon

Mitglied
Hallo,
ich habe ein Problem bei einer Datumsberechnung. Ich möchte folgendes machen:
Zu einem fixen Datum (hier der 1.1.2009) möchte ich eine Anzahl Sekunden hinzuaddieren. Ich meine nicht Bereiche irgendwas zwischen 0 und 60, sondern die Anzahl der Sekunden die z.B. bis zum heutigen Tag vergangen sind (seit dem Fixdatum).

Dazu mache ich folgendes:
-----------------------------------------------
private static GregorianCalendar zerodate=new GregorianCalendar(2009,Calendar.JANUARY,1,0,0);

GregorianCalendar datetime=new GregorianCalendar(TimeZone.getDefault());

this.datetime.setTimeInMillis(zerodate.getTimeInMillis()+(((long) date)*1000));
-----------------------------------------------

Mit date = Anzahl der Sekunden die addiert werden sollen.

Lese ich nun das Datum von datetime aus, gibt der mir immer eine Stunde zuviel aus.
Erst habe ich auf ein Problem der Sommerzeit getippt, aber da wir ja schon GMT + 2 sein verstehe ich nicht warum er noch eine Stunde draufrechnen sollte.

Die Systemzeit steht auf automatische Sommer / Winterzeitumstellung.

Hat jemand eine Idee was ich hier falsch mache?

Danke und Lg
 
S

SlaterB

Gast
deine Beschreibung enthält zuwenig Infos, was wo gesetzt wird, ausgegeben, vergleichen,
woraus du welche Schlüsse ziehst, von Code ganz zu schweigen

hier ist ein Beispiel:
Java:
public class Test
{
    public static void main(String[] args)
    {
        GregorianCalendar zeroDate = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
        zeroDate.set(2009, Calendar.JANUARY, 1, 0, 0, 0);
        Date date = zeroDate.getTime();
        System.out.println("hour: " + zeroDate.get(Calendar.HOUR_OF_DAY));
        GregorianCalendar otherDate = new GregorianCalendar();
        otherDate.setTime(date);
        System.out.println("hour: " + otherDate.get(Calendar.HOUR_OF_DAY));

        DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
        System.out.println(df.getTimeZone());
        System.out.println(df.format(date));
        df.setTimeZone(TimeZone.getTimeZone("GMT"));
        System.out.println(df.format(date));
    }
}
Ausgabe:
Code:
hour: 0
hour: 1
sun.util.calendar.ZoneInfo[id="Europe/Berlin",offset=3600000,dstSavings=3600000,useDaylight=true,[..]
01.01.2009 01:00:00
01.01.2009 00:00:00
zur GMT-Zeit ist das eingegebene Datum Stunde 0,
in einem Calendar mit mitteleuropäischer Zeit (Standardzeitzone für Computer in Deutschland) ist die Stunde 1

bei der Ausgabe des immer desselben Date-Objektes mit SimpleDateFormat macht die Zeitzone auch wieder einen Unterschied

die Abweichung zwischen London/ GMT und Berlin beträgt 1 Stunde,
es sei denn es ist Sommer, dann 2 Stunden wegen Sommerzeit (setze July statt January)
 

myon

Mitglied
Vielen Dank erstmal für die schnelle Antwort :)

Also mein Code sieht so aus:
Ich deklariere folgende Member:

Java:
private static GregorianCalendar zerodate=new GregorianCalendar(2009,Calendar.JANUARY,1,0,0);
GregorianCalendar datetime=new GregorianCalendar(TimeZone.getDefault());

Dabei gehe ich davon aus das beide Calendar mit der hier gültigen Zeitzone (also im Moment GMT + 2) instanziiert sind.

Ich gehe dann in einer Methode hin und berechne die Summe des "Zerodate" und der übergebenen Anzahl in Sekunden:

Java:
public ECGMeasurement(int[] values,int date,int code){	
	this.values=values;
	this.code=code;
	this.datetime.setTimeInMillis(zerodate.getTimeInMillis()+(((long) date)*1000));
	this.period=values.length/800;	
	}

Über eine weitere Methode
Java:
public GregorianCalendar getTime(){
	return this.datetime;
}
gebe ich dann mein datetime zurück.

Dieses gebe ich dann mittels
Java:
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm");
System.out.println(df.format(i.getTime().getTime()));

Und dort wird + 1 Stunde bei mir angezeigt. Für mich hat es den Anschein als ob er meint wir wären bei GMT +1 und rechnet noch eine Stunde drauf. Ich weiss aber nicht wie ich ihm das abgewöhnen soll.

In deinem Beispiel initialisiert du zeroDate mit der GMT. Dann ist die Differenz klar. Aber bei mir sehe ich den Fehler irgendwie nicht :(

Schonmal danke :)
 
S

SlaterB

Gast
wir SIND bei GMT+1
Aktuelle Uhrzeit und Datum - Weltzeituhr | Zeitzonen.de
nur im Sommer ist es noch ne Stunde mehr, dann +2,
aber January != Sommer

wenn du irgendein unbekanntes (((long) date)*1000
in nicht reproduzierbaren/ auführbaren Code addierst und dann irgendwas von +- einer Stunde erzählst,
enthält das für mich keine relevanten Informationen ;)
 

Atze

Top Contributor
warum muss ich dann hier WEZ +2 einstellen, damit die uhr richtig geht? funzt das was mit der sommerzeit nicht?
 
S

SlaterB

Gast
meinst du die Forumeinstellungen? ganz schön themenfremd,
ich habe
(WEZ +1:00) Mitteleuropäische Zeit (MEZ), Berlin, Madrid, Paris,
und das geht
 

myon

Mitglied
wir SIND bei GMT+1
Aktuelle Uhrzeit und Datum - Weltzeituhr | Zeitzonen.de
nur im Sommer ist es noch ne Stunde mehr, dann +2,
aber January != Sommer

Richtig. Deshalb ja
abei gehe ich davon aus das beide Calendar mit der hier gültigen Zeitzone (also im Moment GMT + 2) instanziiert sind.

Die Zeitzone in der wir sind ist GMT +1, im Sommer addieren wir noch 1 dazu und haben GMT +2

Und wenn ich nun zu einem bestimmten Zeitpunkt, sei es nun Sommer oder Winterzeit, in der gleichen Locale eine bestimmte Zeit addiere, gehe ich davon aus, das die Calendar Klasse merkt ob sie in der lokalen Sommer oder Winterzeit ist. Und da scheint es bei mir zu haken.

Ich initialisiere in der Winterzeit (Zeitzone GMT +1), und addiere einen Zeitraum, der dann Lokal in der Sommerzeit liegt (immer noch GMT +1, aber er sollte ja GMT +2 drausmachen, so denke ich zumindest, da wir im Sommer nicht mit der geographischen Zeitzone übereinstimmen ;)
Und da scheint es Probleme zu geben. Für mich hat es den Anschein als ob er 2 mal die Stunde addiert.
 
S

SlaterB

Gast
> und addiere einen Zeitraum, der dann Lokal in der Sommerzeit liegt

bei solchen komplizierten Aktionen können tausend Dinge schiefgehen,
ohne lauffähiges Testprogramm spiele ich da nicht mehr mit,

kannst ja in meinem Programm einen großen Zeitraum addieren und sehen, das alles bestens ist,
oder wenn nicht, dann deine Probleme schildern und ich kann schauen, ob ich sie korrigieren kann
 

myon

Mitglied
Ich dachte mein Problem wäre ersichtlich mit dem Code ;)

Hier mal alles zusammengetragen als lauffähiges Beispiel:

Java:
public class test {
	static GregorianCalendar zerodate=new GregorianCalendar(2009,Calendar.JANUARY,1,0,0);
	static GregorianCalendar datetime=new GregorianCalendar();	
	
	public static void main (String[] args){	
		int date=20000596;
		datetime.setTimeInMillis(zerodate.getTimeInMillis()+(((long) date)*1000));
		SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm");
		System.out.println(df.format(datetime.getTime()));	
	}
}

Date ist die Anzahl der Sekunden vom 1.1.2009 00:00 bis heute, 11:43.
Die Ausgabe ist aber 12.43.

Ändere ich die Zeitzone in den Calendar Objekten auf "GMT" und führe dann dort die Berechnungen durch, gibt er mir, wie zu erwarten, 13.43, aus.
 
S

SlaterB

Gast
wenn du die Calendar-Objekte auf GMT setzt, dann erzeugen die andere Dates/ longTimeInMillis,
je nachdem, welche Daten gesetzt werden,

System.out.println(zerodate.getTimeInMillis());
liefert für 2009, Calendar.JANUARY, 1
in Berlin-Zeit den Wert
1230764400000,
für GMT-Zeit den Wert
1230768000890

also eine Abweichung von rund 3.6 Mio. Millisekunden = 1 Stunde

> Date ist die Anzahl der Sekunden vom 1.1.2009 00:00 bis heute, 11:43.

falsch, du hast sicherlich die verschluckte/ zusätzliche Stunde durch die Zeitumstellung nicht eingerechnet
 
Zuletzt bearbeitet von einem Moderator:

sparrow

Top Contributor
Java:
package test;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class Main {
    static GregorianCalendar zerodate=new GregorianCalendar(2009,Calendar.JANUARY,1,0,0);
    static GregorianCalendar datetime=new GregorianCalendar();

    public static void main (String[] args){
        int date=20000596;
        datetime.setTimeInMillis(zerodate.getTimeInMillis()+(((long) date)*1000));
        SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm z Z");
        System.out.println(df.format(zerodate.getTime()));
        System.out.println(df.format(datetime.getTime()));
    }
}
 

myon

Mitglied
falsch, du hast sicherlich die verschluckte Stunde durch die Zeitumstellung nicht eingerechnet
Das dachte ich zuerst auch, insbesondere da dieser Zeitstempel von einem Gerät kommt.
Aber: Gebe ich Code in c# ein, der das gleiche macht, bekomme ich die korrekte Uhrzeit.
(ja, ich weiss, pfui MS und so ;)

Für mich hat es den Anschein dass ich a) die Datumsarithmetik in Java nicht durchschaue, oder b) diese einfach unter bestimmten Bedingungen falsch ist, die aber für mich noch nicht klar sind.


p.s.
In c# lautet der Code:

---------------------------
class Program
{
public static void Main(string[] args)
{
int a=20000596;
DateTime dt=new DateTime(2009,1,1,0,0,0);

Console.WriteLine(dt.AddSeconds(a));
Console.ReadKey(true);
}
}
-------------------------

Der sollte das gleiche erreichen wie der Java Code
Ich habe auch schon versucht in java über add() zu gehen, bringt aber auch das falsche Ergebnis

lg
 

sparrow

Top Contributor
Dein Code funktioniert doch einwandfrei? Und sogar, falls C# das anders macht, noch viel besser als dort.
Führst du bitte mal meinen Code von oben aus damit du den Unterschied siehst.
 
S

SlaterB

Gast
wer weiß was C# als Ausgaben (edit: hier sollte Zeitzonen stehen) für das DateTime-Objekt + separat für die Ausgabe verwendet,
Kombination von verschiedenen Faktoren ;)

baue dir eine Schleife, addiere ständig 3600*24*1000 drauf und lasse dir das pro Tag ausgeben, in beiden Programmen,
dann siehst du wo wann Sommerzeit eingerechnet wird oder nicht
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
@Sparrow, du hast um 12.43 gepostet, da passt die Programmausgabe von 12.43 ziemlich gut,
myon hätte aber lieber 11.43 ;)

ich behaupte immer noch, dass in Deutschland von 1.1. 00:00 bis heute 11.43 nicht 20000596 Sekunden vergangen sind,

in England von 1.1. 00:00 bis heute 11:43 vielleicht, ja, aber das ist auch eine Stunde mehr,
denn heute 11:43 in England ist heute 13.43 in Deutschland während am 1.1. 00:00 die Abweichung nur eine Stunde betrug
 
Zuletzt bearbeitet von einem Moderator:

sparrow

Top Contributor
@Sparrow, du hast um 12.43 gepostet, da passt die Programmausgabe von 12.43 ziemlich gut,
myon hätte aber lieber 11.43 ;)

Verdammt... das ist wieder son Spruch den ich nicht verstehe...

Ok, hier der Hint an myon, die Ausgabe des Programmes oben:

Code:
run:
2009-01-01 00:00 MEZ +0100
2009-08-20 12:43 MESZ +0200
BUILD SUCCESSFUL (total time: 0 seconds)
 
Zuletzt bearbeitet:

myon

Mitglied
Falls es noch für jemanden von Interesse ist:
Ich habe das Problem folgendermassen lösen können

Java:
Calendar cal = Calendar.getInstance();
		java.util.GregorianCalendar gc=new java.util.GregorianCalendar();
		
		cal.clear();
		cal.set(Calendar.YEAR, 2009);
		cal.set(Calendar.MONTH, 0);
		cal.set(Calendar.DAY_OF_MONTH, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);		
			
		this.datetime.setTimeInMillis( (((long) date)*1000)
				+ cal.getTimeInMillis()-gc.get(Calendar.DST_OFFSET));

Um die korrekte Zeit zu erhalten muss ich wohl den DST_OFFSET abziehen. Seitdem berechnet Java einwandfrei im Winter wie im Sommer die Zeit.

Nochwas zur Erklärung der Sekunden seit dem 1.1.09. Dieser Wert berücksichtigt nicht die Sommerzeit, gibt also immer GMT +1 ein (Was ich später erfuhr). Java ist dann folgerichtig hingegangen und hat, da Sommerzeit ist, noch ne Stunde drauf gerechnet.

Viele Grüsse und nochmals Danke für die Hilfe :)
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben