Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zeitumrechnung möglich? (https://www.delphipraxis.net/170599-zeitumrechnung-moeglich.html)

Chriscode 25. Sep 2012 13:12

Zeitumrechnung möglich?
 
Hallo zusammen,
ich würde gerne wissen ob es möglich ist eine Datums und Zeitangabe in eine andere Zeitzone umzurechnen?

Konkret möchte ich gerne Datum und Zeitangaben aus Phoenix (Arizona) in die deutsche Zeit umrechnen:
http://www.timeanddate.com/worldclock/city.html?n=197

Die Zeitzone dort ist demnach UTC/GMT -7 hours, weitere Besonderheit:
"No daylight saving time"

Offen gesagt frage ich mich wirklich ob sich sowas überhaut realisieren lässt. Die Funktion müsste ja auch den Kalender berücksichtigen und Sommer/Winterzeit.

Lässt sich sowas mit Delphi realisieren? Wenn ja, wie wäre euer Ansatz?

Vielen Dank!

LG,
Chris

Medium 25. Sep 2012 13:16

AW: Zeitumrechnung möglich?
 
Warum nicht möglich? :shock:

Zielzeit = Quellzeit - [Quellzeit UTC Versatz] + [Zielzeit UTC Versatz] + [Wenn Quellzeit mit Sommerzeit und Datum im Bereich Sommerzeit, dann 1, sonst 0] - [Wenn Zielzeit mit Sommerzeit und Datum im Bereich Sommerzeit, dann 1, sonst 0]

Chriscode 25. Sep 2012 13:39

AW: Zeitumrechnung möglich?
 
Hallo,
vielen Dank für deine schnelle Antwort.

Und was wäre wenn durch die Zeitverschiebung die Zeit in ein anderes Datum fällt? Dann müsste doch z.B. ein Kalender zur Rate gezogen werden und geschaut werden welches Datum der vorherige Tag war?

Irgendwie habe ich so Angst das es etwas "unsauber" ist

LG,
Chris

DeddyH 25. Sep 2012 13:49

AW: Zeitumrechnung möglich?
 
TDateTime besteht aus Datums- und Zeitanteil, von daher verstehe ich diese Frage nicht.

Sir Rufo 25. Sep 2012 13:51

AW: Zeitumrechnung möglich?
 
Genau so isses. Du müsstest dir eine Liste mit allen Sommerzeitumstellungen holen und pflegen.
BTW in Deutschland gab es auch mal eine Sommerzeit mit 2h Versatz ;)

DeddyH 25. Sep 2012 13:59

AW: Zeitumrechnung möglich?
 
Wenn ich keinen Denkfehler mache, braucht man doch "nur" eine Hilfsfunktion UTCToMESZ, die die Regel (Quelle: Wikipedia):
Zitat:

Die Umstellung von der Normal- auf die Sommerzeit findet am letzten Sonntag im März um 1 Uhr UTC, also in der mitteleuropäischen Zeitzone von 2 Uhr MEZ auf 3 Uhr MESZ, statt.
Die Umstellung von der Sommer- auf die Normalzeit findet am letzten Sonntag im Oktober um 1 Uhr UTC, also in der mitteleuropäischen Zeitzone von 3 Uhr MESZ auf 2 Uhr MEZ, statt.
berücksichtigt. Man berechnet also "Phoenix-Time" + 7 Stunden und lässt das dann durch die Hilfsfunktion laufen.

Chriscode 25. Sep 2012 14:00

AW: Zeitumrechnung möglich?
 
Vielen Dank für eure Antworten.

Leider hört sich das ganze relativ kompliziert und für mich als Anfänger nahezu nicht umsetzbar an.

Gibt es keine einfachere Möglichkeit? z.B. Datum und Zeit in einen Timestamp zu konvertieren und daraus die richtige Zeit holen?

LG,
Chris

Uwe Raabe 25. Sep 2012 14:05

AW: Zeitumrechnung möglich?
 
Vielleicht wirst du ja hier fündig: delphi-tzdb: Time Zone Database for Delphi

Sir Rufo 25. Sep 2012 14:06

AW: Zeitumrechnung möglich?
 
Zitat:

Zitat von DeddyH (Beitrag 1184368)
Wenn ich keinen Denkfehler mache, braucht man doch "nur" eine Hilfsfunktion UTCToMESZ, die die Regel (Quelle: Wikipedia):
Zitat:

Die Umstellung von der Normal- auf die Sommerzeit findet am letzten Sonntag im März um 1 Uhr UTC, also in der mitteleuropäischen Zeitzone von 2 Uhr MEZ auf 3 Uhr MESZ, statt.
Die Umstellung von der Sommer- auf die Normalzeit findet am letzten Sonntag im Oktober um 1 Uhr UTC, also in der mitteleuropäischen Zeitzone von 3 Uhr MESZ auf 2 Uhr MEZ, statt.
berücksichtigt. Man berechnet also "Phoenix-Time" + 7 Stunden und lässt das dann durch die Hilfsfunktion laufen.

Und hat Phoenix zu dem Zeitpunkt Sommer oder Winterzeit?

Jonas Shinaniganz 25. Sep 2012 14:07

AW: Zeitumrechnung möglich?
 
Delphi hat eine ganze Menge anzubieten.

http://docwiki.embarcadero.com/RADSt...um_und_Uhrzeit

Wenn du einen Ansatz brauchst:

Um zb. ohne weitere Überlegungen 2 Stunden von einem DateTime abzuziehen, also die Zeit um 2 Stunden zurück zu drehen geht folgendes:

DateUtils.IncHour (Wobei es auch eigtl "DecHour" ist weil du negative Werte übergeben kannst)

Delphi-Quellcode:
Jetzt : TDatetime

IncHour(Jetzt,-2);


Grüße

DeddyH 25. Sep 2012 14:08

AW: Zeitumrechnung möglich?
 
Gibt es das dort auch? AFAIK ist das eine rein europäische Erfindung.

Jonas Shinaniganz 25. Sep 2012 14:10

AW: Zeitumrechnung möglich?
 
Ich sehe auch grade noch speziell diesen Eintrag:

http://docwiki.embarcadero.com/Libra...tils.TTimeZone

Vielleicht rechnest du einfach hin und dann zurück ->,

du schaffst das schon ;)

Sir Rufo 25. Sep 2012 14:11

AW: Zeitumrechnung möglich?
 
Zitat:

Zitat von DeddyH (Beitrag 1184374)
Gibt es das dort auch? AFAIK ist das eine rein europäische Erfindung.

Diese Erfindung gab es schon, wo noch keiner was von EU wusste ;)

DeddyH 25. Sep 2012 14:13

AW: Zeitumrechnung möglich?
 
Gerade gefunden: http://www.zeitumstellung.de/zeitums...rnational.html
Zitat:

In den US-Bundesstaaten Arizona, Hawaii und Teilen von Indiana sowie in Puerto Rico, Guam, den Virgin Islands und American Samoa gibt es keine Zeitumstellung (vielen Dank an Herrn Wolfgang Buehrer/ Atlanta, für diese Info).

Jonas Shinaniganz 25. Sep 2012 14:14

AW: Zeitumrechnung möglich?
 
"No daylight saving time" Hat er doch im ersten Post geschrieben...

DeddyH 25. Sep 2012 14:16

AW: Zeitumrechnung möglich?
 
Dann hab ich das ja nur bestätigt ;). Macht die Berechnung etwas einfacher wie schon beschrieben.

nuclearping 25. Sep 2012 14:23

AW: Zeitumrechnung möglich?
 
Zitat:

Zitat von Chriscode (Beitrag 1184369)
Vielen Dank für eure Antworten.

Leider hört sich das ganze relativ kompliziert und für mich als Anfänger nahezu nicht umsetzbar an.

Gibt es keine einfachere Möglichkeit? z.B. Datum und Zeit in einen Timestamp zu konvertieren und daraus die richtige Zeit holen?

LG,
Chris

Schau dir mal StrToDateTime / TryToStrDateTime an. Dazu das Gegenstück: FormatDateTime. Kann sein, dass ich jetzt was mit PHP verwechsel, aber imho konntest du beim Datumsformat auch irgendwas mit Zeitzonen angeben. Aber wie schon gesagt ... Wahrscheinlich verwechsel ich da grad was mit PHP. :mrgreen:

DeddyH 25. Sep 2012 14:56

AW: Zeitumrechnung möglich?
 
Ich habe es nicht getestet (und evtl. auch wieder zu kompliziert gedacht), aber klappt das hier?
Delphi-Quellcode:
uses DateUtils;

function ArizonaTimeToMEZ(aDateTime: TDateTime): TDateTime;
const
  UTC_DIFF               = 7;
  SUMMERTIME_RELEVANTHOUR = 2;

  function UTCToMEZ(aDateTime: TDateTime): TDateTime;
  var
    SummerTimeStart, SummerTimeEnd: TDateTime;
    Year: word;

    function LastDayOfWeekOfMonth(Year, month: Integer; DayOfWeek: word): TDate;
    var
      temp: TDate;
    begin
      temp := IncMonth(EncodeDate(Year, month, 1));
      Result := IncDay(temp, (DayOfWeek - DayOfTheWeek(temp) + DaysPerWeek)
        mod DaysPerWeek - DaysPerWeek);
    end;

  begin
    Year := YearOf(aDateTime);
    SummerTimeStart := LastDayOfWeekOfMonth(Year, MonthMarch, DaySunday);
    SummerTimeStart := IncHour(DateOf(SummerTimeStart), SUMMERTIME_RELEVANTHOUR);
    SummerTimeEnd := LastDayOfWeekOfMonth(Year, MonthOctober, DaySunday);
    SummerTimeEnd := IncHour(DateOf(SummerTimeEnd), SUMMERTIME_RELEVANTHOUR);
    Result := aDateTime;
    if DateTimeInRange(aDateTime, SummerTimeStart, SummerTimeEnd) then
      Result := IncHour(Result);
  end;

begin
  Result := UTCToMEZ(IncHour(aDateTime, UTC_DIFF));
end;

Bummi 25. Sep 2012 15:08

AW: Zeitumrechnung möglich?
 
Liste der Anhänge anzeigen (Anzahl: 3)
Ich habe kurz eine allgemeine Klasse gebastelt, vielleicht kannst Du mit der was anfangen, gegf. musst Du sie noch etwas aufbohren.

Chriscode 25. Sep 2012 16:16

AW: Zeitumrechnung möglich?
 
Hallo nochmals,
vielen vielen Dank für die zahlreichen, schnellen und sehr hilfreichen Antworten.

Sowohl die Codelösung von DeddyH als auch die Alternative von Bummi funktionieren, ich bin zusätzlich dank Jonas Shinaniganz noch auf folgende Lösung aufmerksam geworden: http://code.google.com/p/delphi-tzdb/

Damit kann man von einer Timezone in Universalzeit und von dort in eine andere Timezone umwandeln.

Jetzt bin ich unsicher welche Lösung die "beste", also sicherste und zuverlässigste ist. Insbesondere in Bezug auf Sommer/Winterzeit und Kalenderbesonderheiten.

LG,
Chris

DeddyH 25. Sep 2012 16:30

AW: Zeitumrechnung möglich?
 
Meine ist sicherlich nicht die beste, da sie nur von Arizona nach Mitteleuropa umrechnet. Die anderen sind universeller.

Bummi 25. Sep 2012 16:35

AW: Zeitumrechnung möglich?
 
Ich hatte noch einen bösen Bug drin ... DayLightDate wurde nicht berücksichtigt ist behoben.

Uwe Raabe 25. Sep 2012 19:07

AW: Zeitumrechnung möglich?
 
Zitat:

Zitat von Chriscode (Beitrag 1184401)
ich bin zusätzlich dank Jonas Shinaniganz noch auf folgende Lösung aufmerksam geworden: http://code.google.com/p/delphi-tzdb/

Damit kann man von einer Timezone in Universalzeit und von dort in eine andere Timezone umwandeln.

#8

:gruebel:

Chriscode 25. Sep 2012 20:24

AW: Zeitumrechnung möglich?
 
Uwe,
entschuldige bitte vielmals. Der Hinweis kann selbstverständlich von dir, mein Fehler. Da ich versucht habe möglichst alle Antworten direkt zu verwerten bin ich etwas durcheinander gekommen. Von Jonas kam der Hinweis auf TTimezone welches auf dem von dir empfohlenen Projekt nochmals erwähnt wird.

Ich werde alle drei Lösungen nun noch einmal ausgiebig testen und dann schauen womit ich mich am sichersten fühle. Ggf. könnte ich auch alle Lösungen nehmen und dann das Ergebnis zur Sicherheit vergleichen.

Für die schnelle und kompetente Hilfe noch einmal vielen Dank an alle Beteiligten. Es ist wirklich schön, dass dieses Forum Delphi am Leben hält und zeigt was damit alles möglich ist.

LG,
Chris

Olli73 26. Sep 2012 04:41

AW: Zeitumrechnung möglich?
 
Halb OT:

Ich wäre froh, wenn das auch mal jemand Microsoft erklären könnte. Ich ärgere mich seit 2 Jahren damit rum, dass live (bzw. hotmail / outlook.com) beim Synchronisieren mit WP7 und Outlook die Geburtstage immer um 1 Tag verschiebt. Das passiert auch nicht in allen Zeitzonen (aber leider in unserer) und seit einem Update auch nur noch bei Geburtstagen, die in die Sommerzeit fallen.

Das Thema scheint also wirklich nicht trivial zu sein, auch wenn ich mich frage, wieso man überhaupt bei Geburtstagen mit Uhrzeiten/Zeitzonen rechnet...

Jumpy 26. Sep 2012 07:50

AW: Zeitumrechnung möglich?
 
Zitat:

Zitat von Olli73 (Beitrag 1184462)
Halb OT:
Das Thema scheint also wirklich nicht trivial zu sein, auch wenn ich mich frage, wieso man überhaupt bei Geburtstagen mit Uhrzeiten/Zeitzonen rechnet...

Voll OT:
Damit die Reichen und Schönen, die einen eigenen Lear-Jet zur Verfügung haben, in einer Nacht x-mal ihren Geburtstag feiern können.

Back to Topic:
Kann man denn nicht feststellen, was die kritischen Punkte sind (u.a. die Tage an denen die Umstellung von Sommer- auf Winterzeit erfolgt) und die genannten Funktionen gegen diese Punkte prüfen?

Bummi 26. Sep 2012 08:11

AW: Zeitumrechnung möglich?
 
Sind ja vorhanden. In der Registry findest Du die benötigten Infos. In der Klasse von mir siehst Du wo und wie.

Uwe Raabe 26. Sep 2012 10:30

AW: Zeitumrechnung möglich?
 
Zitat:

Zitat von Chriscode (Beitrag 1184442)
Uwe,
entschuldige bitte vielmals.

So hatte ich das nicht gemeint. Deine Formulierung las sich für mich so, als seist du erst auf Umwegen zu dem Link gekommen, den ich ja (zugegeben nur knapp kommentiert) bereits gepostet hatte.

Es passiert mir auch manchmal, daß genau in dem Moment, wo ich auf Antworten klicke, plötzlich ein oder mehrere zusätzliche Beiträge da sind, die ich dann leicht übersehe.

p80286 26. Sep 2012 10:55

AW: Zeitumrechnung möglich?
 
Zitat:

Zitat von Olli73 (Beitrag 1184462)
Halb OT:

Ich wäre froh, wenn das auch mal jemand Microsoft erklären könnte. Ich ärgere mich seit 2 Jahren damit rum, dass live (bzw. hotmail / outlook.com) beim Synchronisieren mit WP7 und Outlook die Geburtstage immer um 1 Tag verschiebt. Das passiert auch nicht in allen Zeitzonen (aber leider in unserer) und seit einem Update auch nur noch bei Geburtstagen, die in die Sommerzeit fallen.

Das Thema scheint also wirklich nicht trivial zu sein, auch wenn ich mich frage, wieso man überhaupt bei Geburtstagen mit Uhrzeiten/Zeitzonen rechnet...

Weil für ein(en) Programm(ierer) der Tag um 0.0:00 uhr anfängt und um 24.59:59,99999
endet.
Für einen Beliebigen Tag wird im allg. das Datum mit der 0-Zeit genommen.
Es wird aber auch das andere Extrem genutzt.
Und was passiert wenn ich auf eine solche Zeit einevStunde rauf oder runter rechne??

Gruß
K-H

Olli73 26. Sep 2012 15:28

AW: Zeitumrechnung möglich?
 
Zitat:

Zitat von p80286 (Beitrag 1184524)
Weil für ein(en) Programm(ierer) der Tag um 0.0:00 uhr anfängt und um 24.59:59,99999
endet.

23:59:59,9999, danach kommt dann schon wieder 0:00:00

Zitat:

Zitat von p80286 (Beitrag 1184524)
Für einen Beliebigen Tag wird im allg. das Datum mit der 0-Zeit genommen.
Es wird aber auch das andere Extrem genutzt.
Und was passiert wenn ich auf eine solche Zeit einevStunde rauf oder runter rechne??

Eben, bei einem Geburtstag würde ich keine Stunde(n) rauf/runter rechnen (bei Terminen ist das was anderes). Und wenn man es denn ganau machen wollte, müsste man auch den Geburts- und/oder aktuellen Aufentaltsort der Person kennen. Wann feiert man eigentlich Geburtstag, wenn man sich in einer anderen Zeitzone befindet: Streng nach der Zeitzone zu Hause (Geburtsort) oder nach der aktuellen? Fragen über Fragen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz