Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.12;
Скачать: CL | DM;

Вниз

Преобразование времени RFC822 в TDateTime   Найти похожие ветки 

 
mfender ©   (2007-07-17 21:00) [0]

Здравствуйте, Уважаемые!
Подскажите, пожалуйста, каким непостижимым образом лучше всего привести время RFC822 (например, Tue, 17 Jul 2007 16:30:00 +0400) к привычному и традиционному TDateTime?

Буду очень признателен за ответы, ибо всю голову уже сломал об клавиши... ))))


 
Anatoly Podgoretsky ©   (2007-07-17 21:02) [1]

> mfender  (17.07.2007 21:00:00)  [0]

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


 
mfender ©   (2007-07-17 21:08) [2]

Я уже пытался использовать StrToDateTime, подменяя предварительно формат ShortTimeFormat - не плучилось. Пробовал XMLTimeToDateTime - видимо тоже не то... И Интернет молчит по этому поводу...

Тем не менее, работают же программы с этим временем (фидридеры всякие - точно)... Эх, видать придётся писать-таки парсер...


 
Anatoly Podgoretsky ©   (2007-07-17 21:13) [3]

> mfender  (17.07.2007 21:08:02)  [2]

Я же сказал не обязательно самому писать, возьми ICS и скопируй из него функцию.


 
mfender ©   (2007-07-17 21:49) [4]

Уже нарисовал такую вот беду:


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.


 
Panel   (2007-07-17 22:07) [5]

не велика задача, под силам начинающему

Далеко не каждому.

Варианты:
- вместо +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 // то же самое, но еще запутаннее...

...и еще много-много-много разных прочих вариантов... а как заголовки спама посмотреть - так просто заглядение!..


 
Anatoly Podgoretsky ©   (2007-07-17 22:13) [6]

> Panel  (17.07.2007 22:07:05)  [5]

Вариантов много, но он то спрашивал про RFC822


 
mfender ©   (2007-07-18 04:00) [7]


> и еще много-много-много разных прочих вариантов...

Вариантов нет. RFC822 очень точно всё описывает. А всё остальное - действительно нелепые варианты ))))


 
sniknik ©   (2007-07-18 09:01) [8]

> // более-менее понятно, но нужны списки часовых поясов
не нужны, все нужное в этой записи. время по гринвичу + сколько добавить чтобы получить локальное, с учетом летнего времени (сдесь летнее, было бы зимнее было бы +0300), т.е. даже думать не надо на эту тему просто приплюсовал часы с минутами и все.

> и еще много-много-много разных прочих вариантов...
вариант единственный, все что не укладывается в схему есть ошибочная запись, т.е. не получилось преобразовать выдавай ексепт.


 
Плохиш ©   (2007-07-18 11:25) [9]


> время по гринвичу + сколько добавить чтобы получить локальное,

Да это в RFC822, но, к сожалению, по сети очень часто гуляет в формате "время местное + разница со временем по гринвичу" и в XSBuiltIns.pas его также интерпретируют. Функции DateTimeToXMLTime и XMLTimeToDateTime.


 
Anatoly Podgoretsky ©   (2007-07-18 11:29) [10]

> Плохиш  (18.07.2007 11:25:09)  [9]

Это другое время, не RFC822 и для него нужен другой парсер.



Страницы: 1 вся ветка

Текущий архив: 2007.08.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.031 c
15-1184445419
olevacho_
2007-07-15 00:36
2007.08.12
ошибка Microsoft .NET Framework v1.1 Redistributable


15-1184346684
Vendict
2007-07-13 21:11
2007.08.12
Поклонники MS


4-1172485867
DVM
2007-02-26 13:31
2007.08.12
Vista: получение информации о загрузке процессора.


2-1184793633
Repavel
2007-07-19 01:20
2007.08.12
FormatFloat


2-1184435002
Sonic90
2007-07-14 21:43
2007.08.12
Кнопка формы на панели задач