Tidszone kode oversættelse fra Windows til Linux i FreePascal

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har denne kode, der fungerer i FreePascal under Windows og har brug for at oversætte den til Linux, men jeg er helt tabt på Time Zone Bias-værdien:


function DateTimeToInternetTime(const aDateTime: TDateTime): String;
{$IFDEF WIN32}
var
  LocalTimeZone: TTimeZoneInformation;
{$ENDIF ~WIN32}
begin
{$IFDEF WIN32}
  // eg. Sun, 06 Nov 1994 08:49:37 GMT  RFC 822, updated by 1123
  Result := FormatDateTime('ddd, dd mmm yyyy hh:nn:ss', aDateTime);
  // Get the Local Time Zone Bias and report as GMT +/-Bias
  GetTimeZoneInformation(LocalTimeZone);
  Result := Result + 'GMT ' + IntToStr(LocalTimeZone.Bias div 60);
{$ELSE}
  // !!!! Here I need the above code translated !!!!
  Result := 'Sat, 06 Jun 2009 18:00:00 GMT 0000';
{$ENDIF ~WIN32}
end;

Bedste reference


Denne fyr har svaret: http://www.mail-archive.com/fpc-pascal@lists.freepascal.org/msg08467.html[7]


Så du vil tilføje brugsklausulen:


uses unix,sysutils,baseunix


variabler for at holde tid/tidzone:


 var
   timeval: TTimeVal;
   timezone: PTimeZone;


..og få 'minutter vest'.


{$ELSE}
  Result := FormatDateTime('ddd, dd mmm yyyy hh:nn:ss', aDateTime);
  TimeZone := nil;
  fpGetTimeOfDay (@TimeVal, TimeZone);
  Result := Result + 'GMT ' + IntToStr(timezone^.tz\_minuteswest div 60);
{$ENDIF ~WIN32}

Andre referencer 1


Jeg har ikke gjort meget pascal på det seneste, så det er bare et tip, snarere end et komplet svar.


Men tjek din compiler hvordan man ringer og linker c-kode. Så kan du bruge time.h som i dette C-eksempel:


/* localtime example */
#include <stdio.h>
#include <time.h>

int main ()
{
  time\_t rawtime;
  struct tm * timeinfo;

  time ( &rawtime );
  timeinfo = localtime ( &rawtime );
  printf ( "Current local time and date: \%s", asctime (timeinfo) );

  return 0;
}


Dette program vil output noget som


  Current local time and date: Sat Jun 06 18:00:00 2009


Du kan bruge sprintf i stedet for printf til at 'udskrive' i en matrix af tegn, og strftime for at give en formatstreng, hvordan det svarer til 'ddd, dd mmm yyyy hh: nn: ss' (sandsynligvis '\% a,\% d\% b\% Y\% H:\% M:\% S ') og brug den globale variabel' lang int tidszone 'i stedet for' LocalTimeZone.Bias '.


Jeg antager, at det vigtigste er at finde ud af, hvordan man kalder c-koden. Måske kan du endda bruge time.h direkte fra pascal, ville jeg undersøge det.