Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизКак перевести дату в нормальный формат? Найти похожие ветки
← →
turbo (2012-09-13 07:38) [0]Есть дата: Sep 17 15:49:28 2012
Как ее привести к виду: dd.mm.yy hh:nn:ss
Спасибо.
← →
Медвежонок Пятачок © (2012-09-13 08:31) [1]если твоя "дата" - это дата, то форматдейттайм.
а если она нифига не дата, а строка, то копи, substr и так далее
← →
Anatoly Podgoretsky © (2012-09-13 08:35) [2]> turbo (13.09.2012 07:38:00) [0]
Парсинг и DateToStr
← →
Ega23 © (2012-09-13 10:15) [3]FormatDateTime(StrToDateTime())
← →
Ega23 © (2012-09-13 10:15) [4]FormatDateTime(StrToDateTime())
← →
turbo (2012-09-13 11:05) [5]Вы сами то пробовали такую конструкцию, прежде чем советовать?
Вот что вы предложили: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 без парсинга?
← →
знайка (2012-09-13 11:20) [6]StrToDateTime перегруженная функция.
← →
Ega23 © (2012-09-13 12:16) [7]
> EConvertError, потому, что StrToDateTime не знает такой
> формат даты:Sep 17 15:49:28 2012, следовательно вопрос?
TFormatSettings + F1
← →
turbouser © (2012-09-13 12:30) [8]
> 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.
---------------------------
ОК
---------------------------
← →
turbouser © (2012-09-13 12:32) [9]очепятка
d := StrToDate(DateToStr(Now,Fmt),Fmt); конечно же.
← →
turbouser © (2012-09-13 12:34) [10]Читаем 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 yyyy format specifiers. The
initial value is fetched from LOCALE_SSHORTDATE."
Так что или самому парсить или найти в интернетах готовое
← →
Ega23 © (2012-09-13 12:39) [11]А, у него там время по-дурному вставлено...
Да, через ФорматСеттингз тоже не получится.
Парсить.
← →
Ega23 © (2012-09-13 12:53) [12]А точнее, я бы исходную строку преобразовал к формату "mmm dd yyyy hh:nn:ss" и уже через стандартные функции.
Единственное, что ТС надо, точно определиться, в его формате dd или d. Собственно, основной геморрой только в случае d, если dd, то простой манипуляцией с Copy всё решается на ура.
← →
turbo (2012-09-13 18:54) [13]Спасибо всем кто принимал участие в обсуждении
Вообщем решил сделать так, не знаю тупо или нет но работает: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;
← →
Jeer © (2012-09-13 21:44) [14]
> 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.
Будем еще развлекаться :)
← →
Jeer © (2012-09-13 22:01) [15]P.S.
Функция на основе хеш - особо компактна :)
function Month2Num_03(sDate: string): integer;
begin
Result := arCnv[ord(sDate[1]) + ord(sDate[2]) + ord(sDate[3])];
end;
P.P.S.
Основано на том, что сумма трех ord(символов) - уникальна в пределах short-названий трех месяцев.
← →
Jeer © (2012-09-13 22:58) [16]4. Функция на основе TStringlist.IndexOf(..)
Time: ~15300 ticks
Жуть.
← →
Jeer © (2012-09-13 23:09) [17]5. Функция на основе TStringList.Values[..]
Time: ~28000 ticks
Еще больший жуть.
← →
Jeer © (2012-09-14 09:54) [18]Вот так так..
P-IV 1.8 GHz 32х против iP5-2400 3.1 GHz 64x
F1 ( if ): 830 vs 288 ticks
F2 (case): 470 vs 590
F3 (hash): 420 vs 200
F4 (.indexOf): 5000 vs 4600
F5 (.Values): 28000 vs 16000
if-ы разбираются намного лучше?
case-ы хуже ???
← →
RWolf © (2012-09-14 10:08) [19]> Jeer © (14.09.12 09:54) [18]
спекулятивное выполнение играет, вероятно;
впрочем, не предъявлен код с case"ом.
← →
Jeer © (2012-09-14 10:36) [20]Наврал, а точнее - попутал:
F1 ( case ): 830 vs 288 ticks
F2 ( if ): 470 vs 590 ticks
//***
function Month2Num_01(sDate: string): integer;
begin
case sDate[1] of
"J": case sDate[2] of
"a": Result := 1;
"u": case sDate[3] of
"n": Result := 6;
"l": Result := 7;
end;
end;
"F": Result := 2;
"M": case sDate[3] of
"r": Result := 3;
"y": Result := 5;
end;
"A": case sDate[3] of
"r": Result := 4;
"g": Result := 8;
end;
"S": Result := 9;
"O": Result := 10;
"N": Result := 11;
"D": Result := 12;
else
Result := -1;
end;
end;
← →
RWolf © (2012-09-14 10:41) [21]можно заметно сэкономить, если передавать параметр с const.
← →
Jeer © (2012-09-14 10:41) [22]Уточнее, как в реальности:
function Month2Num_03(sDate: string): integer;
begin
Result := arCnv[ord(sDate[1]) + ord(sDate[2]) + ord(sDate[3]) - 268];
end;
Таблица замены индекса на номер месяца:
arCnv[0..39]
Заполнены 12 позиций
← →
Jeer © (2012-09-14 10:44) [23]
> можно заметно сэкономить, если передавать параметр с const.
Согласен, хотя тут просто иллюстрация вариантов, а не погоня за абсолютными цифрами.
← →
Jeer © (2012-09-14 10:46) [24]Стало так:)
F1 ( case ): 143 ticks
F2 (if): 450
F3 (hash): 54
F4 (.indexOf): 4500
F5 (.Values): 16000
← →
Anatoly Podgoretsky © (2012-09-14 11:32) [25]> Jeer (14.09.2012 10:36:20) [20]
Данный код выполняется разное время, в зависимости от данных
← →
Jeer © (2012-09-14 12:01) [26]Ну это понятно, но при random выборке большого объема получаем статистически значимый результат, причем повторимый от теста к тесту.
← →
Jeer © (2012-09-14 12:02) [27]Тут вопрос к типу процессора.
← →
Leonid Troyanovsky © (2012-09-14 20:45) [28]
> Jeer © (13.09.12 21:44) [14]
> Будем еще развлекаться :)
function GetMonthIdx (const month: AnsiString): Integer;
resourcestring
rsInvalidMonthName = "Invalid month name";
begin
if Length(month) <> 3 then
raise Exception.CreateRes(@rsInvalidMonthName);
case PInteger(PChar(month))^ of
$006E614A {Jan} : Result := 01;
$00626546 {Feb} : Result := 02;
$0072614D {Mar} : Result := 03;
$00727041 {Apr} : Result := 04;
$0079614D {May} : Result := 05;
$006E754A {Jun} : Result := 06;
$006C754A {Jul} : Result := 07;
$00677541 {Aug} : Result := 08;
$00706553 {Sep} : Result := 09;
$0074634F {Oct} : Result := 10;
$00766F4E {Nov} : Result := 11;
$00636544 {Dec} : Result := 12;
else
raise Exception.CreateRes(@rsInvalidMonthName);
end;
end;
--
Regards, LVT.
← →
Jeer © (2012-09-16 20:24) [29]Ну да, примерно так и предполагался следующий вариант.
В понедельник приведу сравнителный цифра.
← →
Jeer © (2012-09-17 09:28) [30]Битва вариантов GetMonthIdx():
1. Function "Tree case" : 139 ticks
2. Function "If ": 443 ticks
3. Function "Hash ": 53 ticks
4. Function "IndexOf ": 4822 ticks
5. Function "Values ": 16870 ticks
6. Function "Case2 ": 133 ticks
← →
Inovet © (2012-09-17 14:01) [31]> [30] Jeer © (17.09.12 09:28)
> 1. Function "Tree case" : 139 ticks
...
> 6. Function "Case2 ": 133 ticks
Во как, странно. А без этого сколько будет?
if Length(month) <> 3 then
raise Exception.CreateRes(@rsInvalidMonthName);
А так сколько?
function GetMonthIdx (const month: AnsiString): Integer;
begin
Result := 12;
end;
← →
Jeer © (2012-09-17 14:53) [32]Без
if Length(month) <> 3 then
raise Exception.CreateRes(@rsInvalidMonthName);
Function "Tree case": 151 ticks
Function "If ": 452 ticks
Function "Hash ": 54 ticks
Function "IndexOf ": 4458 ticks
Function "Values ": 16026 ticks
Function "Case2 ": 137 ticks
Function "Hash + Case ": 137 ticks
Function "Delta ": 171 ticks
*******
function GetMonthIdx (const month: AnsiString): Integer;
begin
Result := 12;
end;
Несколько запусков по 100 тыщ измерений
Function "IndexOf ": 50 ticks
Function "IndexOf ": 50 ticks
Function "IndexOf ": 52 ticks
Function "IndexOf ": 50 ticks
Function "IndexOf ": 50 ticks
Function "IndexOf ": 54 ticks
Function "IndexOf ": 50 ticks
Function "IndexOf ": 53 ticks
← →
Jeer © (2012-09-17 14:57) [33]// Function "Hash & Case"
function Month2Num_07(const sDate: string): integer;
begin
case byte(sDate[1]) + byte(sDate[2]) + byte(sDate[3]) of
268: Result := 12;
269: Result := 2;
281: Result := 1;
285: Result := 8;
288: Result := 3;
291: Result := 4;
294: Result := 10;
295: Result := 5;
296: Result := 9;
307: Result := 11;
299: Result := 7;
301: Result := 6;
end;
end;
//*** Моделирование разностным уравнением
// Function "Delta"
function Month2Num_08(const sDate: string): integer;
var i: integer;
begin
Result := 0;
for i:= 0 to (byte(sDate[1]) + byte(sDate[2]) + byte(sDate[3]) - 268) do
Result := Result + arZ[i];
end;
arZ[0] := 12;
arZ[1] := -10;
arZ[13] := -1;
arZ[17] := 7;
arZ[20] := -5;
arZ[23] := 1;
arZ[26] := 6;
arZ[27] := -5;
arZ[28] := 4;
arZ[31] := -2;
arZ[33] := -1;
arZ[39] := 5;
← →
Inovet © (2012-09-17 15:11) [34]> [32] Jeer © (17.09.12 14:53)
Так понятнее.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.077 c