Преобразование DateTime <=> string

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Преобразование DateTime <=> string

Сообщение RomeoGolf » 02.06.2015 18:50:10

Здравствуйте!
Имею столбец дат в формате 'dd-mmm-yyyy hh":"nn":"ss"."z', то есть, месяц русскими тремя буквами. Имею желание конвертировать их (даты) в тип TDateTime. Пишем такой тестик:
Код: Выделить всё
procedure TfmMain.Button1Click(Sender: TObject);
var
  fs : TFormatSettings;
  dt : TDateTime;
begin
  fs.ShortDateFormat := 'dd-mmm-yyyy hh":"nn":"ss"."z';
  fs.ShortMonthNames[5] := 'тыры';
  fs.ShortMonthNames[6] := 'пыры';
  str := DateTimeToStr(Now, fs);
  ShowMessage(str);
  dt := StrToDateTime(str, fs);
  ShowMessage(DateTimeToStr(dt));
end;
Первый ShowMessage выдает ожидаемое "02-пыры-2015 16:27:21.484". Вместо второго выскакивает
"Проект <Тыры-пыры> вызвал класс исключения 'EConvertError' с сообщением:
"02-пыры-2015 16:27:21.484" is not a valid date format
По адресу 44EA03"
что, вообще-то, ожидаемо, ибо справка гласит:
"For the date part, the same restrictions apply as for the StrToDate function: The Date must consist of 1 to three numbers,separated by the DateSeparator character."
То есть, дата должна быть, хоть тресни, но числами. Хотя даже замена mmm на mm помогает слабо, приходится играться с DateSeparator.

Собственно, вопрос: Известен ли кому вменяемый способ извлечь дату и время из строки, где часть данных представлена текстом (месяц, день недели, GMT+5 и прочие подобные варианты) стандартными средствами без написания собственных парсеров?
Спасибо за внимание.
RomeoGolf
незнакомец
 
Сообщения: 6
Зарегистрирован: 02.06.2015 18:39:13

Re: Преобразование DateTime <=> string

Сообщение RomeoGolf » 03.06.2015 19:01:32

Жаль. Жаль.

Собственные копания в англоязычной зоне разных интернетов показали, что такое поведение StrToDateTime считается багом и добавлено в багтрекер чуть ли не в 2006 году. Камрад, сообщающий об этом, предлагает workaround в виде использования VarToDateTime, который понимает текстовые методы. Однако, у меня не получилось так воркэраунднуть.

Худо-бедно заработал такой вариант:
Код: Выделить всё
  fs.ShortDateFormat := 'dd-mmm-yyyy hh:nn:ss.z';
  fs.ShortTimeFormat := 'hh:nn:ss.z';
  fs.DateSeparator := '-';
  fs.TimeSeparator := ':';
  fs.ShortMonthNames[6] := 'foo';
  str := DateTimeToStr(Now, fs);
  dt := ScanDateTime('dd-mmm-yyyy hh:nn:ss.z', str, fs);
Худо и бедно - потому что месяц "foo", а не "фуу". С двухбайтными символами вызывает ошибки несоответствия шаблону. Разрыв шаблона у них, видите ли, от русского. Оно и понятно, если глянуть код функции, там работа со строками без UTF8-функций.

Заработало после такого изврата:
Код: Выделить всё
  fs.ShortMonthNames[6] := 'пыры';
  str := DateTimeToStr(Now, fs);
  str := StringReplace(str, 'пыры', '06', [rfIgnoreCase]); // регистр!
  dt := ScanDateTime('dd-mm-yyyy hh:nn:ss.z', str, fs);
Где, ессессно, можно имя месяца и его номер взять из соответствующего массива fs. Однако есть еще один подводный камушек в огород разработчику - rfIgnoreCase не влияет на регистр кириллицы, то есть, чувствительность сохраняется.

Вот вам и UTF8, который в современном fpc везде-превезде.
RomeoGolf
незнакомец
 
Сообщения: 6
Зарегистрирован: 02.06.2015 18:39:13

Re: Преобразование DateTime <=> string

Сообщение Максим » 04.06.2015 01:40:56

RomeoGolf писал(а):Собственные копания в англоязычной зоне разных интернетов показали, что такое поведение StrToDateTime считается багом и добавлено в багтрекер чуть ли не в 2006 году.

Врать-то зачем? В багтрекере нет ни одной открытой ошибки с ключевыми словами "StrToDate", "StrToDateTime", "VarToDateTime".

RomeoGolf писал(а):Разрыв шаблона у них, видите ли, от русского. Оно и понятно, если глянуть код функции, там работа со строками без UTF8-функций.

Преобразование кодировок? Это же для слабаков, верно? :mrgreen:

RomeoGolf писал(а):Вот вам и UTF8, который в современном fpc везде-превезде.

А вот этого никто никогда не заявлял для стабильных версий. Вот вам и незнание матчасти, сквозящее практически из каждого предложения. :)
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Преобразование DateTime <=> string

Сообщение RomeoGolf » 04.06.2015 17:09:46

Врать-то зачем?
http://www.distribucon.com/2006/01/10/DelphiStrToDateTimeWithFormatSettings.aspx
I logged this bug as QC 23301, so if you'd like to see this fixed, please rate this entry and vote on it if it's important enough to you.

А так-то да, огромное спасибо за помощь, знание матчасти и самомнение сквозит из каждой буквы. Конструктивно, правда, ни точки...
Я как-бы спрашивал стандартные способы, что как-бы подразумевает стандартные функции. Преобразование кодировок как-бы предполагает использование стандартных функций, ага? Как и написание прочих велосипедов и самопальных парсеров. Да, я могу StrToDateTime переписать совсем, не слабо. Просто хотел узнать, как это сделать проще. Спасибо за помощь еще раз.
RomeoGolf
незнакомец
 
Сообщения: 6
Зарегистрирован: 02.06.2015 18:39:13

Re: Преобразование DateTime <=> string

Сообщение SSerge » 05.06.2015 12:05:38

RomeoGolf Ничего, что "this bug as QC 23301" относится к Delphi а не к FPC?
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Преобразование DateTime <=> string

Сообщение RomeoGolf » 05.06.2015 19:20:00

Во-вторых, ключевым моментом является тот факт, что такое поведение StrToDateTime считается багом, и это считаю багом нифига не только я. Если это не занесено в багтрекер конкретно fpc, оно уже перестало быть багом?

Во-первых, никто мне здесь не рассказал про VarToDateTime. Никто не рассказал про ScanDateTime. Никто не рассказал про неправильное поведение последней на кириллице в UTF8-строках. Тишина... А когда я нарыл худо-бедно решение, которое можно как-то использовать и, возможно, развить и улучшить, мог бы тихо применить и все, но решил доложить туточки, вдруг кому-то в поиске ответа это поможет. И вот тут-то началось - матчасть я не знаю, багтрекер наизусть не вызубрил, и вру я, и сквозит у меня, и баги дельфи багами фрипаскаля не считаются... Что решение проблемы практически найдено - уже неважно. Воистину - на англоязычных форумах тебе подробно расскажут, как решить, на русскоязычных подробно расскажут, почему ты дурак и какой ты лошара.

Кстати, ScanDateTime справляется даже с "Wed Apr 08 07:32:45 GMT+05:00 2015". Только GMT автоматом учитывать пока не научился, да оно мне и не надо.
RomeoGolf
незнакомец
 
Сообщения: 6
Зарегистрирован: 02.06.2015 18:39:13

Re: Преобразование DateTime <=> string

Сообщение SSerge » 05.06.2015 20:11:36

А давайте я еще усугублю ненависть, сказав что весь тип TDateTime и функции, относящиеся к нему, являются багом и по большему счету полностью непригодны для практического использования в целях получения отметок времени и вычисления временных промежутков между ними в любых временных зонах вне UTC :D
Догадайтесь почему.

RomeoGolf писал(а):баги дельфи багами фрипаскаля не считаются


Угу, баги дельфи считаются фичами FPC и правильным поведением, потому что Основное Предназначение - копировать этот самый Дельфи и его поведение

RomeoGolf писал(а):Во-первых, никто мне здесь не рассказал про VarToDateTime. Никто не рассказал про ScanDateTime. Никто не рассказал про неправильное поведение последней на кириллице в UTF8-строках. Тишина...


А товарищ Никто вполне возможно что и не знает про наличие этих функций. Вы серьезно верите в 100% достоверность информации этого форума? Зря, тут иногда в комментах тааакая пурга проскакивает. Каждый заблуждается в меру своей квалификации
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Преобразование DateTime <=> string

Сообщение RomeoGolf » 05.06.2015 20:37:45

В рамках данной ветки бессмысленно говорить о достоверности и заблуждениях. Есть хорошее форумное правило: "Нечего сказать - промолчи". Но его мало где применяют в рунете. Или считают, что демонстрация своего превосходства над оппонентом - это и есть самое главное, что можно сказать.
Догадайтесь почему.
В этой ветке кто-то спрашивал про формат TDateTime? Про его использование вне UTC? Про вычисление промежутков? Хрен с ним, неважно, что никто не спрашивал, но почему же такая умница не поделится сокровенным знанием? Однако, опять "я-то знаю,но никому не скажу, бе-бе-бе". Не, мне-то не надо, я про этот формат знаю все, что мне нужно для работы с ним плюс еще чуть-чуть, но раз уж начал, раз уж это форум - ...?

Спасибо, добрый человек, что не прошел мимо. Что ж прошел мимо, когда была сотня просмотров и ни одного ответа? Вопрос риторический. Не надо отвечать и сообщать, сколько было просмотров на самом деле.
RomeoGolf
незнакомец
 
Сообщения: 6
Зарегистрирован: 02.06.2015 18:39:13

Re: Преобразование DateTime <=> string

Сообщение Снег Север » 06.06.2015 12:04:37

RomeoGolf писал(а):Если это не занесено в багтрекер конкретно fpc, оно уже перестало быть багом?
Оно не было никогда багом по той простой причине, что такая возможность преобразования текста в дату стандартной функцией никогда не заявлялась. Это ограничение версии языка. Вас что-то не устраивает? Пишите свою функцию и предлагайте ее для включения в будущие реализации. А не нойте, что вам не додали.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3052
Зарегистрирован: 27.11.2007 16:14:47

Re: Преобразование DateTime <=> string

Сообщение RomeoGolf » 06.06.2015 17:00:16

Еще один добрый человек... Откуда вас столько? Где-то дверь сломалась, что ли?
Я не ною. Я предложил решение собственного вопроса, единственный в этой теме, заметьте. Единственное сообщение, несущее полезную информацию в этой ветке - мое, второе. Однако мне уже натыкали, что я матчасть не знаю, у меня сквозит, я багтрекер не читал, теперь еще и ною. А вы тут такие умные, в белом пальто стоите красивые, что ж на вопрос-то не ответили, хоть один? Только и умеете демонстрировать собственную значимость и неполноценность других?
Я своим нытьем показал тем, кому это может пригодиться, как выдрать дату и время из достаточно сложного текстового представления, практически любого. А <> такой умный и не ноющий, что полезного сказал?
Троллефлудеры. Только отбиваете желание делиться с другими своими знаниями.
RomeoGolf
незнакомец
 
Сообщения: 6
Зарегистрирован: 02.06.2015 18:39:13


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru