![]() |
Wann beginnt bei einem Jahr x die Sommerzeit ?
Hallo #,
aus ptb.de Zitat:
Delphi-Quellcode:
Aber: Es kommt 5.3. raus beim Start.
procedure TForm1.FormCreate(Sender: TObject);
var tz : TTimeZoneInformation; tdtTimeStart : TDateTime; tdtTimeEnd : TDateTime; sText : string; begin GetTimeZoneInformation(tz); tz.DaylightDate.wYear := 2014; tz.StandardDate.wYear := 2014; tdtTimeStart := SystemTimeToDateTime(tz.DaylightDate); tdtTimeEnd := SystemTimeToDateTime(tz.StandardDate); sText := 'Start: '+DateToStr(tdtTimeStart)+#13#10+ 'Ende: '+DateToStr(tdtTimeEnd); MessageBox(0, PChar(sText), '', 0); end; Ich könnte dass bissel auch per Funktion schreiben, will ich aber nicht ;) oder muss ich doch ??? Heiko |
AW: Wann beginnt bei einem Jahr x die Sommerzeit ?
|
AW: Wann beginnt bei einem Jahr x die Sommerzeit ?
Du solltest mal die Dokumentation lesen.
![]() 5.3. heißt nicht, daß es der 05.03. ist :!: Denn Jahr = 0, also ist das ein relativer Datumswert. Nur wenn Jahr einen Wert enthält, ist es ein absolutes Datum, was man so direkt verwenden kann. 05.03.0000 = 3. Monat und 5. "Woche" wDayOfWeek gibt den Wochentag an und davon muß der 5 in diesem Monat verwendet werden. |
AW: Wann beginnt bei einem Jahr x die Sommerzeit ?
Auch nicht ganz. In DayLightDate bedeuten die Felder Folgendes:
|
AW: Wann beginnt bei einem Jahr x die Sommerzeit ?
Hallo,
war ein langer Tag heute, der erste Link klappt bei 2014 nicht mal mit dem Taschenrechner, der zweite ist ja noch komplizierter ... ich baue mir jetzt eine eigene Funktion. Select StartSommerZeit From RDB$DataBase ... Heiko |
AW: Wann beginnt bei einem Jahr x die Sommerzeit ?
So?
siehe erstes IF im ConvertDate
Delphi-Quellcode:
uses
Windows, SysUtils, DateUtils, Math; type TTimeZoneInformationHelper = record helper for TTimeZoneInformation public const CurrentYear = 0; NextDates = 1; private procedure ConvertDate(var Date: TSystemTime; IsDaylight, DoNextDates: Boolean; RelDate: TSystemTime); function GetDate(Index: Integer): TDateTime; function GetDateStr(Index: Integer): string; public procedure ReadInfo(Year: Word=NextDates; DoConvertDates: Boolean=True); procedure ConvertDates(DoNextDates: Boolean=False); overload; procedure ConvertDates(DoNextDates: Boolean; RelDate: TSystemTime); overload; property GetStandardDate: TDateTime index 0 read GetDate; property GetDaylightDate: TDateTime index 1 read GetDate; property GetStandardDateStr: string index 0 read GetDateStr; property GetDaylightDateStr: string index 1 read GetDateStr; end; { TTimeZoneInformationHelper } procedure TTimeZoneInformationHelper.ConvertDate(var Date: TSystemTime; IsDaylight, DoNextDates: Boolean; RelDate: TSystemTime); var NextZone: TTimeZoneInformation; NewDate: TDateTime; begin if Date.wYear = 0 then begin Date.wYear := RelDate.wYear; if Date.wDay < 5 then Date.wDay := DayOf(EncodeDayOfWeekInMonth(Date.wYear, Date.wMonth, Date.wDay, IfThen(Date.wDayOfWeek = 0, 7, Date.wDayOfWeek))) else begin NewDate := EncodeDayOfWeekInMonth(Date.wYear, Date.wMonth, 1, IfThen(Date.wDayOfWeek = 0, 7, Date.wDayOfWeek)); while MonthOf(NewDate) = MonthOf(IncWeek(NewDate)) do NewDate := IncWeek(NewDate); Date.wDay := DayOf(NewDate); end; end; if DoNextDates and (SystemTimeToDateTime(RelDate) > SystemTimeToDateTime(Date)) then begin NextZone.ReadInfo(RelDate.wYear + 1, True); if IsDaylight then Date := NextZone.DaylightDate else Date := NextZone.StandardDate; end; end; procedure TTimeZoneInformationHelper.ConvertDates(DoNextDates: Boolean); var Current: TSystemTime; begin GetLocalTime(Current); ConvertDates(DoNextDates, Current); end; procedure TTimeZoneInformationHelper.ConvertDates(DoNextDates: Boolean; RelDate: TSystemTime); begin ConvertDate(Self.StandardDate, False, DoNextDates, RelDate); ConvertDate(Self.DaylightDate, True, DoNextDates, RelDate); end; function TTimeZoneInformationHelper.GetDate(Index: Integer): TDateTime; begin if Index = 0 then Result := SystemTimeToDateTime(Self.StandardDate) else Result := SystemTimeToDateTime(Self.DaylightDate); end; function TTimeZoneInformationHelper.GetDateStr(Index: Integer): string; begin Result := DateTimeToStr(GetDate(Index)); end; procedure TTimeZoneInformationHelper.ReadInfo(Year: Word; DoConvertDates: Boolean); begin if Year in [CurrentYear, NextDates] then begin if GetTimeZoneInformation(Self) = TIME_ZONE_ID_INVALID then RaiseLastOSError; end else if not GetTimeZoneInformationForYear(Year, nil, Self) then RaiseLastOSError; if DoConvertDates then ConvertDates(Year = NextDates); end;
Delphi-Quellcode:
var
TZI: TTimeZoneInformation; begin TZI.ReadInfo; ShowMessage('Start: ' + TZI.GetStandardDateStr + sLineBreak + 'Ende: ' + TZI.GetDaylightDateStr); |
AW: Wann beginnt bei einem Jahr x die Sommerzeit ?
Wäre es möglich, das das so einfach geht?
Delphi-Quellcode:
Function AnfangDerSommerzeit(Jahr : Word) : TDateTime;
Begin result := EncodeDate(Jahr,4,1); // return result - DayOfWeek(Result); // Letzter Sonntag im März result := result - DayOfWeek(Result); End; Function EndeDerSommerzeit(Jahr : Word) : TDateTime; Begin result := EncodeDate(Jahr,11,1); // return result - DayOfWeek(Result); // Letzter Sonntag im Oktober result := result - DayOfWeek(Result); End; |
AW: Wann beginnt bei einem Jahr x die Sommerzeit ?
Zitat:
Hilfe Furtbichler, was macht denn das 'return' da drin? Ist das 'return' nicht eher was für C++ ? Das erinnert mich irgendwie auch an Basic, aber ehrlich, ich verstehe die Funktion so nicht. Ich habe Deine Funktion in meinem Delphi getestet und so geht sie dann:
Delphi-Quellcode:
Hm, da stellt sich mir noch die Frage, ob die Funktion zwei Resultate blitzschnell und fürs Auge unbemerkt liefert, oder ob das erste 'result' in der Funktion verbleibt...
Function TForm1.AnfangDerSommerzeit(Jahr : Word) : TDateTime;
Begin result := EncodeDate(Jahr,4,1); result:= (result - DayOfWeek(Result))+1; // Letzter Sonntag im März End; Function TForm1.EndeDerSommerzeit(Jahr : Word) : TDateTime; Begin result := EncodeDate(Jahr,11,1); result:= (result - DayOfWeek(Result))+1; // Letzter Sonntag im Oktober End; |
AW: Wann beginnt bei einem Jahr x die Sommerzeit ?
Zitat:
Mit result wird ja auch nicht aus der Funktion herausgesprungen, daher zählt das was als letztes, bevor die Funktion verlassen wird, in result geschrieben wird. Grüße Klaus |
AW: Wann beginnt bei einem Jahr x die Sommerzeit ?
Zitat:
Das 'result' ist einfach eine lokale Variable, die Du verwenden kannst. Wie Klaus01 schon richtig schrieb, entspricht sie dem Resultat. Eine Sprunganweisung ist mit der Zuweisung nicht verbunden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 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