在FreePascal中从Windows到Linux的时区代码转换

时间:2009-06-07 14:17:04

标签: linux windows freepascal

我有这个代码在Windows下的FreePascal中工作,需要将其转换为Linux,但我完全迷失在时区偏差值上:

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;

2 个答案:

答案 0 :(得分:4)

这家伙有答案:http://www.mail-archive.com/fpc-pascal@lists.freepascal.org/msg08467.html

所以你要添加uses子句:

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}

答案 1 :(得分:0)

我最近没有做过很多pascal,所以这只是一个暗示,而不是一个完整的答案。

但请查看编译器如何调用和链接c代码。然后你可以使用time.h类似于这个C-example:

/* 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,我会调查一下。