Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1352355933
Smailer
2012-11-08 10:25
2013.03.22
Непростые но интересные вопросы.


2-1328101281
sergeii01
2012-02-01 17:01
2013.03.22
Запись в файл из нескольких потоков


15-1346597310
Разведка
2012-09-02 18:48
2013.03.22
Посоветуйте книгу


15-1350977971
John Dillinger
2012-10-23 11:39
2013.03.22
горячие клавиши


2-1333815031
novichek
2012-04-07 20:10
2013.03.22
правильная передача параметров в процедуру





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский