ترجمة رمز المنطقة الزمنية من Windows إلى Linux في Freepascal

StackOverflow https://stackoverflow.com/questions/961953

  •  12-09-2019
  •  | 
  •  

سؤال

لدي هذا الرمز الذي يعمل في Freepascal تحت Windows وتحتاج إلى ترجمة ذلك إلى Linux، لكنني ضائع تماما في قيمة BIAS المنطقة الزمنية:

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;
هل كانت مفيدة؟

المحلول

هذا الرجل لديه الجواب: http://www.mail-archive.com/fpc-pascal@lists.freepascal.org/msg08467.html.

لذلك ستحتاج إلى إضافة جملة الاستخدامات:

uses unix,sysutils,baseunix

المتغيرات لعقد الوقت / timezone:

 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}

نصائح أخرى

لم أفعل الكثير من Pascal مؤخرا، لذلك هذه مجرد تلميح، بدلا من إجابة كاملة.

ولكن تحقق من برنامج التحويل البرمجي الخاص بك كيفية الاتصال وربط رمز C. ثم يمكنك استخدام Time.h مماثلة كما هو الحال في ذلك في هذا

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

هذا البرنامج سوف يخرج شيئا مثل

 تاريخ التوقيت الحالي الحالي و Sat Jun 06 18: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-Code. ربما يمكنك حتى استخدام Time.h مباشرة من Pascal، وأود أن التحقيق في ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top