[gelöst] QTime :Umwandlung von UTC nach Lokalzeit (ohne DST)
-
chrislo1976
- Beiträge: 105
- Registriert: 24. Februar 2008 09:45
[gelöst] QTime :Umwandlung von UTC nach Lokalzeit (ohne DST)
Hallo zusammen!
Hat jemand eine Idee wie man es verhindern kann, dass QTime bei der Umwandlung von UTC nach lokaler Zeit die DST (Sommer-/Winterzeit) berücksichtigt?
An und für sich ist es ja gut dass dies automatisch gemacht wird und man es nicht beeinflussen muss, aber in unserem speziellen Fall macht das jetzt Probleme.
Wenn es eine Funktion wie z.B. isDST() gäbe, könnte ich die Korrektur selbst vornehmen, aber ich habe nichts dergleichen finden können.
Wäre für jede Art Info und Hilfe dankbar!
Gruß,
Christian
Hat jemand eine Idee wie man es verhindern kann, dass QTime bei der Umwandlung von UTC nach lokaler Zeit die DST (Sommer-/Winterzeit) berücksichtigt?
An und für sich ist es ja gut dass dies automatisch gemacht wird und man es nicht beeinflussen muss, aber in unserem speziellen Fall macht das jetzt Probleme.
Wenn es eine Funktion wie z.B. isDST() gäbe, könnte ich die Korrektur selbst vornehmen, aber ich habe nichts dergleichen finden können.
Wäre für jede Art Info und Hilfe dankbar!
Gruß,
Christian
Zuletzt geändert von chrislo1976 am 28. September 2009 14:22, insgesamt 1-mal geändert.
-
chrislo1976
- Beiträge: 105
- Registriert: 24. Februar 2008 09:45
Wir speichern sämtliche Zeitangaben in der Datenbank als UTC, weil unser Programm von vorne herein daraus ausgelegt sein soll, in verschiedenen Zeitzonen ohne Probleme zu funktionieren.
Deshalb wird eine lokale Zeit vor dem Speichern in die DB in UTC gewandelt, und nach dem Laden aus der DB wieder in die jeweilige Lokalzeit.
Im Normalfall ist das ok so. Allerdings haben wir jetzt Probleme (oder besser gesagt einen Umstand der uns nicht gefällt) bei dem Regelterminplaner in unserem Programm:
Wenn ich einen Regeltermin erstelle, sagen wir mal jeden 4. Freitag, kann ich auch Uhrzeiten angeben, von wann bis wann der Termin stattfinden soll. Problem ist jetzt, dass sich diese Uhrzeiten um 1 Std. verschieben wenn ein Wechsel von Sommer- nach Winterzeit und umgekehrt stattfindet.
Im Normalfall würde man so einen Regeltermin wohl immer zu selben Zeit machen, egal ob Sommer- oder Winterzeit herrscht...
Wir würden das gerne verhindern, oder noch besser es dem Bediener auswählen lassen können, ob diese "Zeitverschiebung" berücksichtigt werden soll oder nicht.
Ich hoffe ich konnte unser Anliegen etwas besser beleuchten...
Gruß,
Christian
Deshalb wird eine lokale Zeit vor dem Speichern in die DB in UTC gewandelt, und nach dem Laden aus der DB wieder in die jeweilige Lokalzeit.
Im Normalfall ist das ok so. Allerdings haben wir jetzt Probleme (oder besser gesagt einen Umstand der uns nicht gefällt) bei dem Regelterminplaner in unserem Programm:
Wenn ich einen Regeltermin erstelle, sagen wir mal jeden 4. Freitag, kann ich auch Uhrzeiten angeben, von wann bis wann der Termin stattfinden soll. Problem ist jetzt, dass sich diese Uhrzeiten um 1 Std. verschieben wenn ein Wechsel von Sommer- nach Winterzeit und umgekehrt stattfindet.
Im Normalfall würde man so einen Regeltermin wohl immer zu selben Zeit machen, egal ob Sommer- oder Winterzeit herrscht...
Wir würden das gerne verhindern, oder noch besser es dem Bediener auswählen lassen können, ob diese "Zeitverschiebung" berücksichtigt werden soll oder nicht.
Ich hoffe ich konnte unser Anliegen etwas besser beleuchten...
Gruß,
Christian
-
chrislo1976
- Beiträge: 105
- Registriert: 24. Februar 2008 09:45
Gut, ein mehrzeiliger Einzeiler, pseudo:
Wäre jetzt meine erste Idee.
Code: Alles auswählen
int isDst(localtime)
{
utc = toutc(localtime);
utc.setmonth(monat_in_dst);
localtime2 = utc.tolocal();
return localtime2.time() == localtime.time();
}
-
chrislo1976
- Beiträge: 105
- Registriert: 24. Februar 2008 09:45
@pfid
Ich habe jetzt deine erste Idee in das hier umgebaut:
Damit kann ich erkennen ob die übergebene Zeit in der Sommerzeit liegen wird wenn sie in die Lokalzeit umgewandelt wird. Wenn ja kann ich dann die umgewandelte Zeit ggf. korrigieren.
Ich setz' den Thread mal noch nicht auf gelöst, denn ich möchte erst noch weiter testen, und evtl. hat ja jemand anders Einwände oder noch Verbesserungen...
Bis hier schon mal recht vielen Dank!
Ich habe jetzt deine erste Idee in das hier umgebaut:
Code: Alles auswählen
int isDst(QDateTime utc)
{
// given DateTime is/has to be UTC
utc.setTimeSpec(Qt::UTC);
// convert given DateTime to LocalTime
QDateTime t1 = utc.toLocalTime();
// change month of given DateTime to January,
// because there's no summer time
QDate d = utc.date();
d.setDate(utc.date().year(), 1, utc.date().day());
utc.setDate(d);
// ...and also convert that time to LocalTime
QDateTime t2 = utc.toLocalTime();
// If this time's are different, the given
// DateTime is in DST
return t1.time() != t2.time();
}Ich setz' den Thread mal noch nicht auf gelöst, denn ich möchte erst noch weiter testen, und evtl. hat ja jemand anders Einwände oder noch Verbesserungen...
Bis hier schon mal recht vielen Dank!
-
chrislo1976
- Beiträge: 105
- Registriert: 24. Februar 2008 09:45
Hallo!
Also, ich hab jetzt noch einiges getestet, und eigentlich keine Probleme mehr gefunden.
Was ich mir vorstellen könnte was noch ein Problem machen könnte, ist die feste Annahme dass im Januar immer Winterzeit herrscht. Da werd ich wohl noch ein wenig "forschen" müssen um rauszufinden ob das irgendwie/irgendwo ein Problem werden kann...
Gruß,
Christian
Also, ich hab jetzt noch einiges getestet, und eigentlich keine Probleme mehr gefunden.
Was ich mir vorstellen könnte was noch ein Problem machen könnte, ist die feste Annahme dass im Januar immer Winterzeit herrscht. Da werd ich wohl noch ein wenig "forschen" müssen um rauszufinden ob das irgendwie/irgendwo ein Problem werden kann...
Gruß,
Christian
Das hängt wohl davon ab, wo die Sonne grad unterwegs ist: Auf der Südhalbkugel ist im Januar Sommer.
Ist doch außerdem verwirrend, wenn jemand im Sommer 13:00 einstellt und aufeinmal geht das um 12:00 an. Dann besser nur UTC verwenden, dann ist das halt 1-2h verschieden (hier zumindest) statt 0-1h, aber dafür nachvollziehbar. Und du kannst beim Einstellen der Uhrzeit ja parallel die zugehörige Lokalzeit anzeigen lassen.
Ist doch außerdem verwirrend, wenn jemand im Sommer 13:00 einstellt und aufeinmal geht das um 12:00 an. Dann besser nur UTC verwenden, dann ist das halt 1-2h verschieden (hier zumindest) statt 0-1h, aber dafür nachvollziehbar. Und du kannst beim Einstellen der Uhrzeit ja parallel die zugehörige Lokalzeit anzeigen lassen.
-
chrislo1976
- Beiträge: 105
- Registriert: 24. Februar 2008 09:45
Hallo!
Mitunter durch die Funktion isDst() ist es jetzt so dass eine Zeit eines Termins immer gleich bleibt, egal ob Sommer- oder Winterzeit. Es ist auch egal ob der Termin ursprünglich im Sommer oder im Winter angelegt wurde.
Einmal 12 Uhr, immer 12 Uhr!
In einer anderen Zeitzone allerdings wird aus 12 Uhr aber schon eine andere Zeit, je nach Zeitverschiebung.
Gruß,
Christian
Genau um das ging es ja...Ist doch außerdem verwirrend, wenn jemand im Sommer 13:00 einstellt und aufeinmal geht das um 12:00 an.
Mitunter durch die Funktion isDst() ist es jetzt so dass eine Zeit eines Termins immer gleich bleibt, egal ob Sommer- oder Winterzeit. Es ist auch egal ob der Termin ursprünglich im Sommer oder im Winter angelegt wurde.
Einmal 12 Uhr, immer 12 Uhr!
In einer anderen Zeitzone allerdings wird aus 12 Uhr aber schon eine andere Zeit, je nach Zeitverschiebung.
Gruß,
Christian
Nein. Wenn du die Sommerzeit wegkorrigierst stimmt die Zeit nicht mit der vom Beobachter erwarteten Zeit überein: Auf dem Plan steht 13, an geht das um 12. Durch deine Korrektur ist lediglich die Zeitdifferenz zu 2 Terminen identisch.
Und Januar=Sommerzeit kannst du wie gesagt nicht so lassen.
Was du noch beachten musst: Wandelst du UTC in die Lokalzeit um, ist die resultierende Zeit unabhängig von der aktuellen Sommer-/Winter-Situation.
Und Januar=Sommerzeit kannst du wie gesagt nicht so lassen.
Moment, das trifft doch nur zu, wenn du die Lokalzeit benutzt, also mit DST. Wenn es wirklich nur darum geht, dass die Maschine nicht verwirrt wird, musst du UTC nehmen.Es ist auch egal ob der Termin ursprünglich im Sommer oder im Winter angelegt wurde.
Einmal 12 Uhr, immer 12 Uhr! Smile
Was du noch beachten musst: Wandelst du UTC in die Lokalzeit um, ist die resultierende Zeit unabhängig von der aktuellen Sommer-/Winter-Situation.
-
chrislo1976
- Beiträge: 105
- Registriert: 24. Februar 2008 09:45
Ich will dir jetzt mal nicht (vollständig) widersprechen, evtl. verstehe ich ja nicht alles was du geschrieben hast.
ABER: Wie gesagt, jetzt tut unser Terminplaner genau das was er tun soll. VORHER hatte ich Probleme dass die Uhrzeiten um 1 bzw. 2 Stunden verschoben waren!
das:
ABER: Wie gesagt, jetzt tut unser Terminplaner genau das was er tun soll. VORHER hatte ich Probleme dass die Uhrzeiten um 1 bzw. 2 Stunden verschoben waren!
Warum ergibt dann:Wandelst du UTC in die Lokalzeit um, ist die resultierende Zeit unabhängig von der aktuellen Sommer-/Winter-Situation.
Code: Alles auswählen
QDateTime dt1 = QDateTime(QDate(2009,1,29), QTime(14,0,0), Qt::UTC);
qDebug() << dt1.toLocalTime().toString();
QDateTime dt2 = QDateTime(QDate(2009,9,29), QTime(14,0,0), Qt::UTC);
qDebug() << dt2.toLocalTime().toString();Es müsste doch laut deiner Aussage beide Male die gleiche Uhrzeit ausgegeben werden?!"Do 29. Jan 15:00:00 2009"
"Di 29. Sep 16:00:00 2009"
Ich glaube ich habe dein Problem nicht richtig verstanden, d.h. wo genau die Differenzen auftreten und aus welcher Perspektive. Deine Zeitangaben scheinen außerdem garnicht Datumsabhängig zu sein..
Naja wie auch immer. Mit meiner letzten Aussage meine ich, dass QDateTime(QDate(2009,1,29), QTime(14,0,0), Qt::UTC) im Sommer wie im Winter in Lokalzeit "Do 29. Jan 15:00:00 2009" ergibt. Ist wohl klar. Aber diese Tatsache kam mir als Hindernis vor. Den Sinn mit diesen komischen Sommerwegrechnungen aber trotzdem auf Lokalzeit beharren habe ich noch nicht verstanden, und glaube nicht, dass das eine gute Lösung ist. Aber musst du besser wissen. Ggf. irgendwie das Datum, an dem der Plan "jeden 4. Freitag" erstellt wurde, mitbenutzen..
MfG,
FaS
Naja wie auch immer. Mit meiner letzten Aussage meine ich, dass QDateTime(QDate(2009,1,29), QTime(14,0,0), Qt::UTC) im Sommer wie im Winter in Lokalzeit "Do 29. Jan 15:00:00 2009" ergibt. Ist wohl klar. Aber diese Tatsache kam mir als Hindernis vor. Den Sinn mit diesen komischen Sommerwegrechnungen aber trotzdem auf Lokalzeit beharren habe ich noch nicht verstanden, und glaube nicht, dass das eine gute Lösung ist. Aber musst du besser wissen. Ggf. irgendwie das Datum, an dem der Plan "jeden 4. Freitag" erstellt wurde, mitbenutzen..
MfG,
FaS