![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Преобразование времени RFC822 в TDateTime [D7]
mfender © (2007-07-17 21:00:00)Здравствуйте, Уважаемые!
Подскажите, пожалуйста, каким непостижимым образом лучше всего привести время RFC822 (например, Tue, 17 Jul 2007 16:30:00 +0400) к привычному и традиционному TDateTime?
Буду очень признателен за ответы, ибо всю голову уже сломал об клавиши... ))))
Anatoly Podgoretsky (2007-07-18 11:29:00) [1]> Плохиш (18.07.2007 11:25:09) [9]
Это другое время, не RFC822 и для него нужен другой парсер.
Плохиш (2007-07-18 11:25:00) [2]
> время по гринвичу + сколько добавить чтобы получить локальное,
Да это в RFC822, но, к сожалению, по сети очень часто гуляет в формате "время местное + разница со временем по гринвичу" и в XSBuiltIns.pas его также интерпретируют. Функции DateTimeToXMLTime и XMLTimeToDateTime.
sniknik (2007-07-18 09:01:00) [3]> // более-менее понятно, но нужны списки часовых поясов
не нужны, все нужное в этой записи. время по гринвичу + сколько добавить чтобы получить локальное, с учетом летнего времени (сдесь летнее, было бы зимнее было бы +0300), т.е. даже думать не надо на эту тему просто приплюсовал часы с минутами и все.
> и еще много-много-много разных прочих вариантов...
вариант единственный, все что не укладывается в схему есть ошибочная запись, т.е. не получилось преобразовать выдавай ексепт.
mfender (2007-07-18 04:00:00) [4]
> и еще много-много-много разных прочих вариантов...
Вариантов нет. RFC822 очень точно всё описывает. А всё остальное - действительно нелепые варианты ))))
Anatoly Podgoretsky (2007-07-17 22:13:00) [5]> Panel (17.07.2007 22:07:05) [5]
Вариантов много, но он то спрашивал про RFC822
Panel (2007-07-17 22:07:00) [6]не велика задача, под силам начинающему
Далеко не каждому.
Варианты:
- вместо +0400 стоит (MSK) // более-менее понятно, но нужны списки часовых поясов
- вместо +0400 стоит (ZKR) // и такое бывает... но не понятно, что?
- вместо + 0400 стоит +0390 // ну... бывает...
- вместо Tue, 17 Jul 2007 16:30:00 +0400 стоит 17 Jul 2007 16:30:00 +0400 // кому понятно, а кому - не очень... алгоритм должен быть гибким
- вместо Tue, 17 Jul 2007 16:30:00 +0400 стоит 2007 Jul 17 16:30:00 // то же самое, но еще запутаннее...
...и еще много-много-много разных прочих вариантов... а как заголовки спама посмотреть - так просто заглядение!..
mfender (2007-07-17 21:49:00) [7]Уже нарисовал такую вот беду:
unit mfXMLTimeToDateTime;
interface
uses SysUtils, DateUtils;
const Months: array[0..11] of PChar =
('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec');
function mf_XMLTimeToDateTime(XMLTime: string): TDateTime;
function mf_GetNormalInt(Str: string): Integer;
function mf_GetMonth(Str: string): Integer;
implementation
function mf_XMLTimeToDateTime(XMLTime: string): TDateTime;
var Day, Month, Year, Hour, Minutes, Seconds: Integer;
begin
Day := mf_GetNormalInt(Copy(XMLTime, 6, 2));
Month := mf_GetMonth(Copy(XMLTime, 9, 3));
Year := mf_GetNormalInt(Copy(XMLTime, 13, 4));
Hour := mf_GetNormalInt(Copy(XMLTime, 18, 2));
Minutes := mf_GetNormalInt(Copy(XMLTime, 21, 2));
Seconds := mf_GetNormalInt(Copy(XMLTime, 24, 2));
Result := EncodeDateTime(Year, Month, Day, Hour, Minutes, Seconds, 0);
end;
function mf_GetNormalInt(Str: string): Integer;
begin
if Copy(Str, 1, 1) = '0' then Result := StrToInt(Copy(Str, 2, 1))
else Result := StrToInt(Str);
end;
function mf_GetMonth(Str: string): Integer;
var I: Integer;
begin
Result := 1;
for I := 1 to 12 do
begin
if Months[I - 1] = Str then Result := I;
end;
end;
end.
Anatoly Podgoretsky (2007-07-17 21:13:00) [8]> mfender (17.07.2007 21:08:02) [2]
Я же сказал не обязательно самому писать, возьми ICS и скопируй из него функцию.
mfender (2007-07-17 21:08:00) [9]Я уже пытался использовать StrToDateTime, подменяя предварительно формат ShortTimeFormat - не плучилось. Пробовал XMLTimeToDateTime - видимо тоже не то... И Интернет молчит по этому поводу...
Тем не менее, работают же программы с этим временем (фидридеры всякие - точно)... Эх, видать придётся писать-таки парсер...
Anatoly Podgoretsky (2007-07-17 21:02:00) [10]> mfender (17.07.2007 21:00:00) [0]
Либо использовать какую ни будь библиотеку либо написать свою функцию, не велика задача, под силам начинающему. За пару часов с отладкой.