2009-06-07 30 views
0

我有這樣的代碼,在FreePascal的Windows環境下工作,並需要將其轉換爲Linux,但我上的時區偏差值完全喪失:時區代碼轉換到Linux在FreePascal的

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; 

回答

4

這傢伙的答案:http://www.mail-archive.com/[email protected]/msg08467.html

所以你要添加的使用條款:

uses unix,sysutils,baseunix 

變量來保存時間/時區:

var 
    timeval: TTimeVal; 
    timezone: PTimeZone; 

..並獲得'西部分鐘'。

{$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} 
+0

感謝隊友,你是明星。你有戰利品;) – 2009-06-16 14:20:17

0

我最近沒有做很多帕斯卡,所以這些只是一個暗示,而不是一個完整的答案。

但檢查你的編譯器如何調用和鏈接c代碼。然後你可以使用time.h中類似的如本C-例如:

/* 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; 
} 

這個程序將輸出類似

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

您可以用sprintf代替了printf「打印」到數組字符和strftime給出格式字符串有多類似於'ddd,dd mmm yyyy hh:nn:ss'(可能是「%a,%d%b%Y%H:%M:%S」)並使用' long int timezone'全局變量而不是'LocalTimeZone.Bias'。

我想主要的障礙是弄清楚如何調用c代碼。也許你甚至可以直接從pascal使用time.h,我會調查一下。

+0

這可以是一個答案。我會在FreePascal下進行調查,然後接受或降級你的答案。 – 2009-06-11 21:59:57