Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Преобразование времени 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]

Либо использовать какую ни будь библиотеку либо написать свою функцию, не велика задача, под силам начинающему. За пару часов с отладкой.


Наверх

Титульная страница Поиск, карта сайта Написать письмо