Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];

Вниз

Преобразование времени 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.044 c
2-1184754884
***mikle***
2007-07-18 14:34
2007.08.12
Class TSocketServer not found


9-1157377908
Артём
2006-09-04 17:51
2007.08.12
OpenGL & 3DMax


2-1184240820
pathfinder
2007-07-12 15:47
2007.08.12
Лог ftp-клиента..


2-1184694657
Sdubaruhnul
2007-07-17 21:50
2007.08.12
Что-то вроде событий, вызываемых потоком.


15-1184451994
lookin
2007-07-15 02:26
2007.08.12
Интернет-ресурс с контурными изображениями





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский