Avatar billede gtu Nybegynder
22. april 2009 - 19:36 Der er 5 kommentarer og
1 løsning

Unix tid

Hej

har dette stykke kode til at omdanne til unix tid.. men den er 3600 sekunder bagud...

Hvordan for jeg den til at tage højde for sommer/vinter tid? den tids zone der er sat på PCen

function DateTimeToUnix(Value: TDateTime): LongWord;
var  Year: Word;
    Month: Word;
    Day: Word;
    Hour: Word;
    Min: Word;
    Sec: Word;
    MSec: Word;
    x: extended;
    y: extended;
    TimeZone: TTimeZoneInformation;
    TheZone: float;
begin

  DecodeDate(Value, Year, Month, Day);
  DecodeTime(Value, Hour, Min, Sec, MSec);
  GetTimeZoneInformation(TimeZone);
  TheZone := TimeZone.Bias div -60;

  x := (EncodeDate(Year, Month, Day) - EncodeDate(1970, 1, 1)) * 86400 ;
  y := (Hour*3600) + (Min*60) + Sec;
  x := x+y-(TheZone*3600);
  result := StrToInt( FloatToStr(x) );

end;
Avatar billede falster Ekspert
22. april 2009 - 22:16 #1
Der er noget "Daylight Savings Time" funktion i denne unit.

Måske kan du kombinere med din kode:

http://www.delphipages.com/threads/thread.cfm?ID=205223&G=205222
Avatar billede arne_v Ekspert
24. april 2009 - 04:21 #2
Forsimplet version som virker:

function D2U(Value: TDateTime): LongWord;

var
  tz : TTimeZoneInformation;
  res : LongWord;

begin
  res := trunc((value - StrToDateTime('01-01-1970 00:00:00')) * 24 * 60 * 60);
  if GetTimeZoneInformation(tz) = TIME_ZONE_ID_DAYLIGHT then begin
    res := res + (tz.DaylightBias + tz.Bias) * 60
  end else begin
    res := res + (tz.StandardBias + tz.Bias) * 60;
  end;
  D2U := res;
end;
Avatar billede arne_v Ekspert
24. april 2009 - 04:21 #3
Demo:

program unixtime;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

function time(t : pointer) : integer; cdecl; external 'msvcrt.dll';

function D2U(Value: TDateTime): LongWord;

var
  tz : TTimeZoneInformation;
  res : LongWord;

begin
  res := trunc((value - StrToDateTime('01-01-1970 00:00:00')) * 24 * 60 * 60);
  if GetTimeZoneInformation(tz) = TIME_ZONE_ID_DAYLIGHT then begin
    res := res + (tz.DaylightBias + tz.Bias) * 60
  end else begin
    res := res + (tz.StandardBias + tz.Bias) * 60;
  end;
  D2U := res;
end;

var
  t : TDateTime;

begin
  writeln(D2U(now));
  writeln(time(nil));
  readln;
end.
Avatar billede arne_v Ekspert
24. april 2009 - 15:23 #4
Og for en god ordens skyld:
- koden antager at den testede data har samme sommer/vinter tids status som nu
- hvis den betingelse skal opfyldes skal man lave et mere avanceret test
- der er *umuligt* at lave et perfekt test da man i den time hvor uret stilles tilbage vil have *en* lokal tid som svarer til *to* forskellike unix tid
Avatar billede gtu Nybegynder
27. maj 2009 - 19:55 #5
Tak.. og et svar
Avatar billede arne_v Ekspert
27. maj 2009 - 20:03 #6
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester