DELPHI FAQ: Как конвертировать RFC дату и обратно?


Как конвертировать RFC дату и обратно?
Previous  Home  Next




function
 DateTimeToRfcTime(
  dt: TDateTime;
  iDiff: integer;
  blnGMT: boolean = false): string
;
{*
Explanation:
iDiff is the local offset to GMT in minutes
if blnGMT then Result is UNC time else local time
e.g. local time zone: ET = GMT - 5hr = -300 minutes
    dt is TDateTime of 3 Jan 2001 5:45am
      blnGMT = true  -> Result = 'Wed, 03 Jan 2001 05:45:00 GMT'
      blnGMT = false -> Result = 'Wed, 03 Jan 2001 05:45:00 -0500'
*}

const

  Weekday: array
[1..7of string =
  ('Sun'
'Mon''Tue''Wed''Thu''Fri''Sat');
  Month: array
[1..12of string = (
    'Jan'
'Feb''Mar''Apr''May''Jun',
    'Jul'
'Aug''Sep''Oct''Nov''Dec');
var

  iDummy: Word;
  iYear: Word;
  iMonth: Word;
  iDay: Word;
  iHour: Word;
  iMinute: Word;
  iSecond: Word;
  strZone: string
;
begin

  if
 blnGMT then
  begin

    dt := dt - iDiff / 1440
;
    strZone := 'GMT'
;
  end

  else

  begin

    iDiff := (iDiff div
 60) * 100 + (iDiff mod 60);
    if
 iDiff < 0 then
      strZone := Format('-%.4d'
, [-iDiff])
    else

      strZone := Format('+%.4d'
, [iDiff]);
  end
;
  DecodeDate(dt, iYear, iMonth, iDay);
  DecodeTime(dt, iHour, iMinute, iSecond, iDummy);
  Result := Format('%s, %.2d %s %4d %.2d:%.2d:%.2d %s'
, [
    Weekday[DayOfWeek(dt)], iDay, Month[iMonth], iYear,
      iHour, iMinute, iSecond, strZone]);
end
;

function RfcTimeToDateTime(
  strTime: string
;
  blnGMT: boolean = true): TDateTime;
{*
Explanation:
if blnGMT then Result is UNC time else local time
e.g. local time zone: ET = GMT - 5hr = -0500
    strTime = 'Wed, 03 Jan 2001 05:45:00 -0500'
      blnGMT = true  -> FormatDateTime('...', Result) = '03.01.2001 10:45:00'
      blnGMT = false -> FormatDateTime('...', Result) = '03.01.2001 05:45:00'
*}

const

  wd = 'sun#mon#tue#wed#thu#fri#sat'
;
  month = 'janfebmaraprmayjunjulaugsepoctnovdec'
;
var

  s: string
;
  dd: Word;
  mm: Word;
  yy: Word;
  hh: Word;
  nn: Word;
  ss: Word;
begin

  s := LowerCase(Copy(strTime, 1
3));
  if
 Pos(s, wd) > 0 then
    Delete(strTime, 1
, Pos(' ', strTime));
  s := Trim(Copy(strTime, 1
, Pos(' ', strTime)));
  Delete(strTime, 1
, Length(s) + 1);
  dd := StrToIntDef(s, 0
);
  s := LowerCase(Copy(strTime, 1
3));
  Delete(strTime, 1
4);
  mm := (Pos(s, month) div
 3) + 1;
  s := Copy(strTime, 1
4);
  Delete(strTime, 1
5);
  yy := StrToIntDef(s, 0
);
  Result := EncodeDate(yy, mm, dd);
  s := strTime[1
] + strTime[2];
  hh := StrToIntDef(strTime[1
] + strTime[2], 0);
  nn := StrToIntDef(strTime[4
] + strTime[5], 0);
  ss := StrToIntDef(strTime[7
] + strTime[8], 0);
  Delete(strTime, 1
9);
  Result := Result + EncodeTime(hh, nn, ss, 0
);
  if
 (CompareText(strTime, 'gmt') <> 0and blnGMT then
  begin

    hh := StrToIntDef(strTime[2
] + strTime[3], 0);
    nn := StrToIntDef(strTime[4
] + strTime[5], 0);
    if
 strTime[1] = '+' then
      Result := Result - EncodeTime(hh, nn, 0
0)
    else

      Result := Result + EncodeTime(hh, nn, 0
0);
  end
;
end
;

Взято с Delphi Knowledge Base
http://www.baltsoft.com/







DELPHI FAQ




EOMY TOP 100      Рейтинг@Mail.ru      Rambler's Top100