24. februar 2003 - 14:05
#8
1)
Sæt en TMemo på en form.
2)
Lav et OnCreate Event
3)
Prøv det her :
function Date2Month(const DT: TDateTime): Word;
var
D, Y: Word;
begin
DecodeDate(DT, Y, Result, D);
end;
function Date2Year(const DT: TDateTime): Word;
var
D, M: Word;
begin
DecodeDate(DT, Result, M, D);
end;
function ThisYear: Word;
begin
Result := Date2Year(Date);
end;
function DateIsLeapYear(const DT: TDateTime): Boolean;
begin
Result := IsLeapYear(Date2Year(DT));
end;
function DaysInMonth(const DT: TDateTime): Byte;
begin
case Date2Month(DT) of
2: if DateIsLeapYear(DT) then
Result := 29
else
Result := 28;
4, 6, 9, 11: Result := 30;
else
Result := 31;
end;
end;
function DayOfMonth2Date(year, month, weekInMonth, dayInWeek: word): TDateTime;
var
days: integer;
day: integer;
begin
if (weekInMonth >= 1) and (weekInMonth <= 4) then
begin
day := DayOfWeek(EncodeDate(year, month, 1)); // get first day in month
day := 1 + dayInWeek - day; // get first dayInWeek in month
if day <= 0 then
Inc(day, 7);
day := day + 7 * (weekInMonth - 1); // get weekInMonth-th dayInWeek in month
Result := EncodeDate(year, month, day);
end
else if weekInMonth = 5 then
begin // last week, calculate from end of month
days := DaysInMonth(EncodeDate(year, month, 1));
day := DayOfWeek(EncodeDate(year, month, days)); // get last day in month
day := days + (dayInWeek - day);
if day > days then
Dec(day, 7); // get last dayInWeek in month
Result := EncodeDate(year, month, day);
end
else
Result := 0;
end; { DayOfMonth2Date }
function DSTDate2Date(dstDate: TSystemTime; year: word): TDateTime;
begin
if dstDate.wMonth = 0 then
Result := 0 // invalid month => no DST info
else if dstDate.wYear = 0 then
begin // day-of-month notation
Result :=
DayOfMonth2Date(year, dstDate.wMonth, dstDate.wDay, dstDate.wDayOfWeek + 1 {convert to Delphi Style}) +
EncodeTime(dstDate.wHour, dstDate.wMinute, dstDate.wSecond, dstDate.wMilliseconds);
end
else if dstDate.wYear = year then // absolute format - valid only for specified year
Result := SystemTimeToDateTime(dstDate)
else
Result := 0;
end;
function GetTZDaylightSavingInfoForYear(
TZ: TTimeZoneInformation; year: word;
var DaylightDate, StandardDate: TDateTime;
var DaylightBias, StandardBias: longint): boolean;
begin
Result := false;
if (TZ.DaylightDate.wMonth <> 0) and (TZ.StandardDate.wMonth <> 0) then
begin
DaylightDate := DSTDate2Date(TZ.DaylightDate, year);
StandardDate := DSTDate2Date(TZ.StandardDate, year);
DaylightBias := TZ.Bias + TZ.DaylightBias;
StandardBias := TZ.Bias + TZ.StandardBias;
Result := (DaylightDate <> 0) and (StandardDate <> 0);
end;
end;
function GetTZDaylightSavingInfo(TZ: TTimeZoneInformation; var DaylightDate, StandardDate: TDateTime; var DaylightBias, StandardBias: longint): boolean;
begin
Result := GetTZDaylightSavingInfoForYear(TZ, ThisYear, DaylightDate, StandardDate, DaylightBias, StandardBias);
end;
procedure TForm1.FormCreate(Sender: TObject);
const
OrdNums: array[1..5] of string = ('første', 'anden', 'tredje', 'fjerde', 'sidste');
MINUTESPERDAY = 1440;
var
tz: TTimeZoneInformation;
StartDate: TDateTime;
EndDate: TDateTime;
DayBias: longint;
StdBias: longint;
DaylightBias: longint;
StandardBias: longint;
begin
GetTimeZoneInformation(tz);
if not GetTZDaylightSavingInfo(TZ, StartDate, EndDate, DaylightBias, StandardBias) then
exit;
StdBias := TZ.Bias + TZ.StandardBias;
DayBias := TZ.Bias + TZ.DaylightBias;
Memo1.Lines.Add('Sommertid begynder den ...');
if TZ.DaylightDate.wYear = 0 then
with TZ.DaylightDate do
Memo1.Lines.Add(Format('%s %s of %s at %s GMT', [OrdNums[wDay], LongDayNames[wDayOfWeek + 1], LongMonthNames[wMonth], TimeToStr(EncodeTime(wHour, wMinute, wSecond, wMilliseconds) + StdBias / MINUTESPERDAY)]));
Memo1.Lines.Add('I år : ' + FormatDateTime('c', StartDate));
Memo1.Lines.Add('Sommertid ender den ...');
if TZ.StandardDate.wYear = 0 then
with TZ.StandardDate do
Memo1.Lines.Add(Format('%s %s i %s klokken %s GMT', [OrdNums[wDay], LongDayNames[wDayOfWeek + 1], LongMonthNames[wMonth], TimeToStr(EncodeTime(wHour, wMinute, wSecond, wMilliseconds) + DayBias / MINUTESPERDAY)]));
Memo1.Lines.Add('I år : ' + FormatDateTime('c', EndDate));
end;