![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как перевести дату в нормальный формат? [D7, XP]
turbo © (2012-09-13 07:38:00)Есть дата: Sep 17 15:49:28 2012
Как ее привести к виду: dd.mm.yy hh:nn:ss
Спасибо.
Jeer (2012-09-13 21:44:00) [21]
> if month='Jan' then month:='01';
Да, это наглядно, но неинтересно.
1. Функция от ТС
function F01(s: month): integer;
if month='Jan' then Result:=1;
...
end;
Time: ~830 ticks
2. Функция ( на основе case), разбирающая отдельные символы и ветвления.
Time: ~470 ticks
3. Функция на основе хеш-а от трех символов
Time: ~420 ticks
P.S.
Замеры на цикле в мильон - достаточно релевантны.
Примерно так:
for i := 1 to N do begin
m := Random(12); // random-выборка месяца
_T1 := tsvTiming.GetCPUTicksP_; // старт time
k := Month2Num_01(arMonth[m]);
dt := dt + tsvTiming.GetCPUTicksP_ - _T1; // стоп-time и delta
b := b and ((m+1)=k); // тест на валидность результата
end;
P.S.
Будем еще развлекаться :)
turbo (2012-09-13 18:54:00) [22]Спасибо всем кто принимал участие в обсуждении
Вообщем решил сделать так, не знаю тупо или нет но работает:
function datetime_info_CRL(info_crl:string):TdateTime;
var
temp_str:string;
month,day,time,year:string;
begin
//Получаем дату из строки
temp_str:=Copy(info_crl,Pos('nextUpdate=',info_crl)+11,Pos('GMT',info_crl)-Pos('nextUpdate=',info_crl)-11);
//Выполняем разбор строки для перевода в нормальный формат
//первые 3 символа названия месяца
month:= Copy(temp_str,0,3);
if month='Jan' then month:='01';
if month='Feb' then month:='02';
if month='Mar' then month:='03';
if month='Apr' then month:='04';
if month='May' then month:='05';
if month='Jun' then month:='06';
if month='Jul' then month:='07';
if month='Aug' then month:='08';
if month='Sep' then month:='09';
if month='Oct' then month:='10';
if month='Nov' then month:='11';
if month='Dec' then month:='12';
//день следущие 2 цифры
day:= Copy(temp_str,5,2);
//Время
time:= Copy(temp_str,8,8);
//Год
year:= Copy(temp_str,17,4);
//Конвертируем дату
try
result:=StrToDateTime(day+'.'+month+'.'+year+' '+time);
except
end;
end;
Ega23 (2012-09-13 12:53:00) [23]А точнее, я бы исходную строку преобразовал к формату 'mmm dd yyyy hh:nn:ss' и уже через стандартные функции.
Единственное, что ТС надо, точно определиться, в его формате dd или d. Собственно, основной геморрой только в случае d, если dd, то простой манипуляцией с Copy всё решается на ура.
Ega23 (2012-09-13 12:39:00) [24]А, у него там время по-дурному вставлено...
Да, через ФорматСеттингз тоже не получится.
Парсить.
turbouser (2012-09-13 12:34:00) [25]Читаем SysUtils.pas
" ShortDateFormat - The format string used to convert a date value to a
short string suitable for editing. For a complete description of date and
time format strings, refer to the documentation for the FormatDate
function. The short date format should only use the date separator
character and the m, mm, d, dd, yy, and yyyyformat specifiers. The
initial value is fetched from LOCALE_SSHORTDATE."
Так что или самому парсить или найти в интернетах готовое
turbouser (2012-09-13 12:32:00) [26]очепятка
d := StrToDate(DateToStr(Now,Fmt),Fmt); конечно же.
turbouser (2012-09-13 12:30:00) [27]
> Ega23 © (13.09.12 12:16) [7]
> TFormatSettings + F1
Не получится.
var
d: tdatetime;
Fmt: TFormatSettings;
begin
GetLocaleFormatSettings(1033, Fmt);
Fmt.ShortDateFormat := 'mmm dd hh:mm:ss yyyy';
ShowMessage(DateToStr(Now,Fmt)); //''Sep 13 12:28:51 2012''
d := StrToDate(DateToStr(Now,Fmt));
end
---------------------------
xxx
---------------------------
''Sep 13 12:28:51 2012'' is not a valid date.
---------------------------
ОК
---------------------------
Ega23 (2012-09-13 12:16:00) [28]
> EConvertError, потому, что StrToDateTime не знает такой
> формат даты:Sep 17 15:49:28 2012, следовательно вопрос?
TFormatSettings + F1
знайка (2012-09-13 11:20:00) [29]StrToDateTime перегруженная функция.
turbo (2012-09-13 11:05:00) [30]Вы сами то пробовали такую конструкцию, прежде чем советовать?
Вот что вы предложили:
FormatDateTime('dd.mm.yy hh:nn:ss',StrToDateTime('Sep 17 15:49:28 2012'));
Что в итоге получаем?
EConvertError, потому, что StrToDateTime не знает такой формат даты:Sep 17 15:49:28 2012, следовательно вопрос?
Как конвертировать эту дату в формат: dd.mm.yy hh:nn:ss без парсинга?
Ega23 (2012-09-13 10:15:00) [31]FormatDateTime(StrToDateTime())
Ega23 (2012-09-13 10:15:00) [32]FormatDateTime(StrToDateTime())
Anatoly Podgoretsky (2012-09-13 08:35:00) [33]> turbo (13.09.2012 07:38:00) [0]
Парсинг и DateToStr
Медвежонок Пятачок (2012-09-13 08:31:00) [34]если твоя "дата" - это дата, то форматдейттайм.
а если она нифига не дата, а строка, то копи, substr и так далее