Перевод кода часовых поясов из Windows в Linux во FreePascal

У меня есть этот код, который работает в FreePascal под Windows, и мне нужно перевести его в 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;

person Gustavo Carreno    schedule 07.06.2009    source источник


Ответы (2)


У этого парня есть ответ: 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}
person russau    schedule 15.06.2009
comment
Спасибо, приятель, ты звезда. У тебя есть добыча ;) - person Gustavo Carreno; 16.06.2009
comment
ву ху! Онлайн-справка находится здесь: freepascal.org/docs-html/rtl/ unix/fpgettimeofday.html - person russau; 17.06.2009
comment
Значит, он получает бабло за ссылку на мой ответ? - person Marco van de Voort; 23.06.2009
comment
хотите верьте, хотите нет - я попросил функцию разделить добычу со всеми, у кого есть ссылка: stackoverflow.uservoice.com/pages/1722-general/suggestions/ - person russau; 24.06.2009

В последнее время я мало занимался паскалем, так что это всего лишь подсказка, а не полный ответ.

Но проверьте свой компилятор, как вызывать и компоновать 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-код. Может быть, вы даже можете использовать time.h непосредственно из паскаля, я бы исследовал это.

person Tobias    schedule 11.06.2009
comment
Это может быть ответом. Я изучу это во FreePascal, а затем приму или понизлю ваш ответ. - person Gustavo Carreno; 12.06.2009