Mega Code Archive

 
Categories / Delphi / System
 

TDateTime RFC

Title: TDateTime RFC Question: How to convert a RFC time string into TDateTime and vv. Answer: Conversion of date & time formats: RFC TDateTime (local & UNC) RFC: e.g. 03.01.2001 05:45:00 -0500 TDateTime - RFC use DateTimeToRfcTime(date, diff, gmt) RFC - TDateTime use RfcTimeToDateTime(time, gmt) 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..7] of string = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); Month: array[1..12] of 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 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') 0) and 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;