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
..
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 <
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'
) <>
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
;
Взято с
Delphi Knowledge Base
http://www.baltsoft.com/
DELPHI FAQ