function StrToDateTime(const S: string; const FormatSettings: TFormatSettings): TDateTime; overload;
Проблема в том, что она не работает. И вот почему:
При использовании в настройках локали формата для ShortDate вида dd.mm.yyyy и подобных все впорядке. Но стоит указать в формате dd-mmm-yyyy или dd-mmmm-yyyy или ddd-mm-yyyy использование этой функции не представляется возможным. Особенность этих форматов — день или месяц указываются не цифрами а буквами.
Если кому-то не лень посмотреть исходник этой функции, то там есть такие интересные строки:
if not (ScanNumber(S, Pos, N1, L1) and ScanChar(S, Pos, DateSeparator) and
ScanNumber(S, Pos, N2, L2)) then Exit;
Из этих двух замечательных строчек можно видеть, что борланд вообще не расчитывал принимать буквы в строчке из которой конвертится. Если посмотреть на функцию дальше, то видно, что из FormatSettings ничего кроме DateSeparator и TimeSeparator не используется вообще.
Кто не верит, пусть попробует установить в локали короткий формат для даты dd-mmm-yyyy и преобразовать из строки '10-янв-2007' в дату.
Собственно вопросы:
1. Риторический — о чем думали в борланде когда это писали?
2. Как с этим можно бороться (кроме как написать собственный функционал с учетом всего, что на самом деле есть в FormatSettings'ах)? Есть ли готовые решения?
Просто смотря на .NET даж завидно становится, там все учтено. Но в силу обстоятельств приходится использовать детище борланда.
П.С. Извиняюсь за много текста, просто уже накипело
Re: опять StrToDateTime или о чем думали в борланде?
[scip]
А самому розродиться и написать?
Причина почему не написано — банальна. .НЕт затевался с поддержкой юникода, интернационала
А делфи нет. К тому же поддерживать все извраты — уж извольте.
И напоследок, в хелпе сказано что она поддерживает? нет? так что же критикуете. Универсально написать нельзя
... << RSDN@Home 1.2.0 alpha rev. 719>>
Re[2]: опять StrToDateTime или о чем думали в борланде?
Здравствуйте, OdesitVadim, Вы писали:
OV>А самому розродиться и написать? OV>Причина почему не написано — банальна. .НЕт затевался с поддержкой юникода, интернационала OV>А делфи нет. К тому же поддерживать все извраты — уж извольте. OV>И напоследок, в хелпе сказано что она поддерживает? нет? так что же критикуете. Универсально написать нельзя
Ну а при чем здесь юникод-то? Эта функция даже текущую локаль не понимает.
А универсальную функцию написать можно. Для этого все необходимое есть в FormatSettings. И я собственно свою реализацию и написал.
Не понимаю я только, почему это в борланде не сделали? Сложно им это было чтоли или лениво?
Re: опять StrToDateTime или о чем думали в борланде?
Кстати, сопутствующий вопрос: Никто не знает, как вытащить границу лет для представления года двумя цифрами. Т.е. когда 30ый год будет считаться 1930 а когда 2030. В реестре есть ключ HKEY_CURRENT_USER/Control Panel/International/Calendars/TwoDigitYearMax но он существует не всегда. Есть ли возможность через API или COM вытащить эту границу?
Re[2]: опять StrToDateTime или о чем думали в борланде?
Привет, Spaun2002!
Вы пишешь 20 августа 2007:
S> В реестре есть ключ HKEY_CURRENT_USER/Control Panel/International/Calendars/TwoDigitYearMax S> но он существует не всегда. Есть ли возможность через API или COM вытащить эту границу?
Если ты его не видишь чистА визуально, то это не означает, что для него нет дефолтного значения.
--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.1 beta
Re: опять StrToDateTime или о чем думали в борланде?
S>Проблема в том, что она не работает. И вот почему:
Кстати, а с какой целью вы её используете?
По своему опыту, напоровшись в детстве на пару граблей с DateTimeToStr/StrToDateTime, клятвенно пообещал себе никогда их больше не использовать, а для хранения даты/времени в текстовом виде применять фиксированный формат (например, ISO).
Пока удаётся этот обет держать, и уже десяток раз убедился в правильности этого подхода.
Re[2]: опять StrToDateTime или о чем думали в борланде?
Здравствуйте, a18, Вы писали:
a18>Кстати, а с какой целью вы её используете? a18>По своему опыту, напоровшись в детстве на пару граблей с DateTimeToStr/StrToDateTime, клятвенно пообещал себе никогда их больше не использовать, а для хранения даты/времени в текстовом виде применять фиксированный формат (например, ISO). a18>Пока удаётся этот обет держать, и уже десяток раз убедился в правильности этого подхода.
Я бы с радостью избавился от подобного представления дат. Но к сожалению этого нельзя сделать. Смесь из DevExpress + различные компоненты доступа + использование программы в разных странах не оставляют места для маневров.
Re[3]: опять StrToDateTime или о чем думали в борланде?
Здравствуйте, Alex.Che, Вы писали:
AC>Если ты его не видишь чистА визуально, то это не означает, что для него нет дефолтного значения.
Я нисколько не сомневаюсь, что это значение есть. И если установленное в системе не отличается от дефолтного, то этот раздел не создается.
Я видимо не правильно выразился ранее: это не ключ, это раздел. А каким образом можно прочитать значения ключей из несуществующего раздела мне неизвестно.
Re: опять StrToDateTime или о чем думали в борланде?
От:
Аноним
Дата:
20.08.07 15:26
Оценка:
GetLocaleFormatSettings() спасает?
Re[3]: опять StrToDateTime или о чем думали в борланде?
Здравствуйте, Spaun2002, Вы писали:
S>Я бы с радостью избавился от подобного представления дат. Но к сожалению этого нельзя сделать. Смесь из DevExpress + различные компоненты доступа + использование программы в разных странах не оставляют места для маневров.
Кстати, возможно, программисты Борланда поступили мудро — лично я бы не рискнул брать ответственность за корректное преобразование строковых дат с учётом особенностей разных языков — хотя бы потому, что в том же Королевстве очень часто задаётся вопрос — как сменить вывод даты с "20 август 2007" на "20 августа 2007 г." Т.е. обратное преобразование в общем случае будет похоже на разгадку шифра (кстати, интересно, как эти вариации .NET переварит), а учитывая, что, к примеру, строка "01/02/07" для американца и британца обозначает совершенно разные даты, проще застрелиться
Re[2]: опять StrToDateTime или о чем думали в борланде?
Здравствуйте, a18, Вы писали:
a18> а учитывая, что, к примеру, строка "01/02/07" для американца и британца обозначает совершенно разные даты, проще застрелиться
Вот вот. Поэтому один с первых релизов Word'а вышел 11/11/9х (год точно не помню). Менеджмент долго спорил как правильно дату вписать. А всё решил главный программист.
... << RSDN@Home 1.2.0 alpha rev. 719>>
Re: опять StrToDateTime или о чем думали в борланде?
Если кому интересно, то Функция GetLocaleFormatSettings еще и неправильно получает формат записи времени. Вернее получает она его правильно, но потом меняет на тот, который ей нравится, а именно на h:mm:ss (AMPM). В некоторых странах время записывается через точку, а не двоеточие...
Re: опять StrToDateTime или о чем думали в борланде?