Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wann beginnt bei einem Jahr x die Sommerzeit ? (https://www.delphipraxis.net/178490-wann-beginnt-bei-einem-jahr-x-die-sommerzeit.html)

hoika 13. Jan 2014 17:28

AW: Wann beginnt bei einem Jahr x die Sommerzeit ?
 
Hallo,

ich hole mir nichts aus Windows.
Die Einstellungen werden vom Nutzer konfiguriert.
Da unser Produkt nur in good old Germany läuft, kann ich mir das leisten ;)

Delphi-Quellcode:
function ErmitteltLetztenSonntagDesMonats(const AJahr, AMonat: Word): TDateTime;
const
  C_So = 7;
var
  tdtDatum : TDateTime;
begin
  Result := 0.0;

  { Start = letzter Tag des Monats }
  tdtDatum := EncodeDate(AJahr, AMonat, DaysInAMonth(AJahr, AMonat));
  if DayOfTheWeek(tdtDatum)=C_So then
  begin
    Result := tdtDatum;
  end
  else
  begin
    repeat
      tdtDatum := tdtDatum-1.0;
      if DayOfTheWeek(tdtDatum)=C_So then
      begin
        Result := tdtDatum;
        break;
      end;
    until False;
  end;
end { ErmitteltLetztenSonntagDesMonats } ;

procedure ErmittleSommerzeit(const AJahr: Word; out tdtStart, tdtEnde: TDateTime);
begin
  tdtStart := ErmitteltLetztenSonntagDesMonats(AJahr, 3);
  tdtEnde := ErmitteltLetztenSonntagDesMonats(AJahr, 10);
end { ErmittleSommerzeit } ;

{*
  Zeit nach GMT (Greenwich Mean Time) konvertieren
  in der Sommerzeit wird eine Stunde abgezogen

  @param ADateTime gegebenes Datum/Uhrzeit
  @return GMT-Zeit
}
function DateTimeNachGMT(const ADateTime: TDateTime): TDateTime;
var
  wJahr   : Word;
  wDummy  : Word;
  tdtDatum : TDateTime;

  tdtSommerzeitStart : TDateTime;
  tdtSommerzeitEnde : TDateTime;
begin
  DecodeDate(ADateTime, wJahr, wDummy, wDummy);
  tdtDatum := DateOf(ADateTime);

  ErmittleSommerzeit(wJahr, tdtSommerzeitStart, tdtSommerzeitEnde);

  if (tdtDatum>=tdtSommerzeitStart) and
     (tdtDatum<=tdtSommerzeitEnde) then
  begin
    Result := IncHour(ADateTime, -1);
  end
  else
  begin
    Result := ADateTime;
  end;
end { DateTimeNachGMT } ;

procedure TTestCaseX.ErmittleSommerzeit;
var
  wJahr   : Word;
  tdtStart : TDateTime;
  tdtEnde : TDateTime;
begin
  wJahr := 2000;
  MyDateUtils.ErmittleSommerzeit(wJahr, tdtStart, tdtEnde);
  Check(tdtStart=EncodeDate(2000,3,26));
  Check(tdtEnde=EncodeDate(2000,10,29));

  wJahr := 2014;
  MyDateUtils.ErmittleSommerzeit(wJahr, tdtStart, tdtEnde);
  Check(tdtStart=EncodeDate(2014,3,30));
  Check(tdtEnde=EncodeDate(2014,10,26));
end;

procedure TTestCaseX.DateTimeNachGMT;
var
  tdtDateTime1 : TDateTime;
  tdtDateTime2 : TDateTime;
  tdtDateTime3 : TDateTime;
begin
  { vor der Sommerzeit }
  tdtDateTime1 := EncodeDate(2000,3,25)+EncodeTime(22,0,0,0);
  tdtDateTime2 := MyDateUtils.DateTimeNachGMT(tdtDateTime1);
  Check(tdtDateTime2=tdtDateTime1);

  { erster Tag der Sommerzeit }
  tdtDateTime1 := EncodeDate(2000,3,26)+EncodeTime(22,0,0,0);
  tdtDateTime2 := MyDateUtils.DateTimeNachGMT(tdtDateTime1);
  tdtDateTime3 := EncodeDate(2000,3,26)+EncodeTime(21,0,0,0);
  Check(tdtDateTime2=tdtDateTime3);

  { vorletzter Tag der Sommerzeit }
  tdtDateTime1 := EncodeDate(2000,10,28)+EncodeTime(22,0,0,0);
  tdtDateTime2 := MyDateUtils.DateTimeNachGMT(tdtDateTime1);
  tdtDateTime3 := EncodeDate(2000,10,28)+EncodeTime(21,0,0,0);
  Check(tdtDateTime2=tdtDateTime3);

  { letzter Tag der Sommerzeit }
  tdtDateTime1 := EncodeDate(2000,10,29)+EncodeTime(22,0,0,0);
  tdtDateTime2 := MyDateUtils.DateTimeNachGMT(tdtDateTime1);
  tdtDateTime3 := EncodeDate(2000,10,29)+EncodeTime(21,0,0,0);
  Check(tdtDateTime2=tdtDateTime3);

  { erster Tag der Winterzeit }
  tdtDateTime1 := EncodeDate(2000,10,30)+EncodeTime(22,0,0,0);
  tdtDateTime2 := MyDateUtils.DateTimeNachGMT(tdtDateTime1);
  tdtDateTime3 := EncodeDate(2000,10,30)+EncodeTime(22,0,0,0);
  Check(tdtDateTime2=tdtDateTime3);
end { DateTimeNachGMT }  ;

Die Performance-"Problem" mit der Schleife sind verglichen mit dem Code,
der noch dahintersteckt, minimal.
Unit-Tests laufen über DUnit.
Ich habe das gekürzt:
Check(tdtDateTime2=tdtDateTime3); heisst eigentlich Check(tdtDateTime2=tdtDateTime3, 'Fehler XXX'); usw.

Heiko

hathor 13. Jan 2014 22:37

AW: Wann beginnt bei einem Jahr x die Sommerzeit ?
 
Ergebnis:

Beginn Sommerzeit: 30.3.2014
Beginn Winterzeit: 26.10.2014


Delphi-Quellcode:
procedure MM(s:string);
begin
  Form1.Memo1.lines.add(s);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
year, month, day : word;
begin
 year:= 2014;
 month:=3;
 day:= 31 - (5*year div 4 + 4) mod 7;
MM('Beginn Sommerzeit: '+inttostr(day)+'.'+inttostr(month)+'.'+inttostr(year));
 month:=10;
 day:= 31 - (5*year div 4 + 1) mod 7;
MM('Beginn Winterzeit:  '+inttostr(day)+'.'+inttostr(month)+'.'+inttostr(year));
end;

Furtbichler 14. Jan 2014 06:33

AW: Wann beginnt bei einem Jahr x die Sommerzeit ?
 
Deine Funktion liefert für die Jahre vor 1900 und ab 2100 ein falsches Ergebnis.
Meine Testfunktion;
Delphi-Quellcode:
Function DateIsLastSundayInMarch (aDate : TDateTime) : Boolean;
Begin
  Result := (DateUtils.DayOfTheWeek(aDate) = DaySunday) // It is a sunday
        and (MonthOf(aDate) = 3)   // in march
        and (MonthOf(aDate+7) = 4); // and the following sunday is in april
End;

hoika 14. Jan 2014 06:59

AW: Wann beginnt bei einem Jahr x die Sommerzeit ?
 
Hallo Furtbichler,

meine ?


#Hathor
Beginn Sommerzeit: 30.3.2014
Beginn Winterzeit: 26.10.2014

Das ist doch aber richtig ?
Der letzte Sonntag im März,
der letzte Sonntag im Oktober.



Heiko

himitsu 14. Jan 2014 08:34

AW: Wann beginnt bei einem Jahr x die Sommerzeit ?
 
Zitat:

Zitat von Furtbichler (Beitrag 1243558)
Deine Funktion liefert für die Jahre vor 1900 und ab 2100 ein falsches Ergebnis.

1900 gab es noch keine Sommerzeit.
(erst ab 1916)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:45 Uhr.
Seite 4 von 4   « Erste     234   

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