Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi TzSpecificLocalTimeToSystemTime für Win9x, NT, 2000? (https://www.delphipraxis.net/44052-tzspecificlocaltimetosystemtime-fuer-win9x-nt-2000-a.html)

hitzi 12. Apr 2005 17:25


TzSpecificLocalTimeToSystemTime für Win9x, NT, 2000?
 
Hallo,

für TzSpecificLocalTimeToSystemTime und SystemTimeToTzSpecificLocalTime wird laut MSDN WinXP benötigt. Gibt es entsprechende Funktionen auch für Win9x, NT und 2000?

Gruss

marabu 12. Apr 2005 18:04

Re: TzSpecificLocalTimeToSystemTime für Win9x, NT, 2000?
 
MS sagt an anderer Stelle auch noch:
Zitat:

The SystemTimeToTzSpecificLocalTime function works in Windows NT. If called in Windows 95, the function fails, and returns FALSE.

hitzi 12. Apr 2005 19:14

Re: TzSpecificLocalTimeToSystemTime für Win9x, NT, 2000?
 
Dann muss ich eben die Funktionen selber erstellen. Über TIME_ZONE_INFORMATION und GetTimeZoneInformation bekommt ja alles Nötige.

Trotzdem danke

hitzi 13. Apr 2005 12:19

Re: TzSpecificLocalTimeToSystemTime für Win9x, NT, 2000?
 
Was haltet hier von folgenden von mir geschriebenen Code:

Delphi-Quellcode:
function GetDateTimeForBiasSystemTime(GivenDateTime : TSystemTime; GivenYear : integer) : TDateTime;
var Year, Month, Day : word;
    Hour, Minute, Second, MilliSecond : word;
begin
  GivenDateTime.wYear := GivenYear;
  while not TryEncodeDayOfWeekInMonth(GivenDateTime.wYear, GivenDateTime.wMonth, GivenDateTime.wDay, GivenDateTime.wDayOfWeek, Result) do
    Dec(GivenDateTime.wDay);

  DecodeDateTime(Result, Year, Month, Day, Hour, Minute, Second, MilliSecond);
  Result := EncodeDateTime(Year, Month, Day, GivenDateTime.wHour, GivenDateTime.wMinute, GivenDateTime.wSecond, GivenDateTime.wMilliseconds);
end;

function GetBiasForDate(GivenDateTime : TDateTime) : integer;
var tzi : TIME_ZONE_INFORMATION;
begin
  GetTimeZoneInformation(tzi);
  if (GivenDateTime < GetDateTimeForBiasSystemTime(tzi.StandardDate, YearOf(GivenDateTime))) and
     (GivenDateTime >= GetDateTimeForBiasSystemTime(tzi.DaylightDate, YearOf(GivenDateTime))) then
    Result := (tzi.Bias + tzi.DaylightBias) * -1
  else
    Result := (tzi.Bias + tzi.StandardBias) * -1;
end;

function UTCToLocalDateTime(aUTC : TDateTime) : TDateTime;
begin
  Result := IncMinute(aUTC, GetBiasForDate(aUTC));
end;

function LocalDateTimeToUTC(aLocal : TDateTime) : TDateTime;
begin
  Result := IncMinute(aUTC, GetBiasForDate(aUTC) * -1);
end;
DateUtils muss eingebunden werden!

Soweit ich es bis jetzt überblickt habe, wird für das entsprechende Datum der korrekte Unterschied in Minuten (Bias) zur UTC Zeit zurückgeliefert und das gegebene Datum entsprechend der verwendeten Funktion umgerechnet.
Diese Funktionen sollten auch unter Win9x nutzbar sein. Für XP System kann man auch die hier beschriebenen Funktionen nehmen.

Was kann man an den oben von mir geposteten Funktionen noch verbessern?

Gruss

glkgereon 13. Apr 2005 12:23

Re: TzSpecificLocalTimeToSystemTime für Win9x, NT, 2000?
 
Zitat:

Delphi-Quellcode:
Result := (tzi.Bias + tzi.StandardBias) * -1;

das geht?
* -1???

hitzi 13. Apr 2005 12:30

Re: TzSpecificLocalTimeToSystemTime für Win9x, NT, 2000?
 
Ja! Der Bias wird nach dem Schema berechnet bias = UTC - local time (MSDN) Deshalb kommt in unseren Fall eine negative Zahl heraus. Um nun die lokalen Zeit ausrechnen möchte muss man UTC + BIAS rechnen. Das funktioniert nur mit der Function IncMinute, wenn man vorher das Vorzeichen vom ermittelten Bias ändert -
Delphi-Quellcode:
Bias := Bias * -1
Gruss

glkgereon 13. Apr 2005 12:33

Re: TzSpecificLocalTimeToSystemTime für Win9x, NT, 2000?
 
kp, aber ich dacht immer man müsste * (-1) schreiben...

Rio1 14. Mai 2007 13:39

Re: TzSpecificLocalTimeToSystemTime für Win9x, NT, 2000?
 
Sommer und Winterzeit sollten ja hier auch automatisch berücksichtigt werden oder?

letzte funktion sollte wahrscheinlich so aussehen
Delphi-Quellcode:
function LocalDateTimeToUTC(aLocal : TDateTime) : TDateTime;
begin
  Result := IncMinute(aLocal, GetBiasForDate(aLocal) * -1);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:43 Uhr.

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