опять StrToDateTime или о чем думали в борланде?
От: Spaun2002 Россия  
Дата: 20.08.07 11:29
Оценка:
Есть такая интересная функция.

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 или о чем думали в борланде?
От: OdesitVadim Украина  
Дата: 20.08.07 11:45
Оценка:
Здравствуйте, Spaun2002, Вы писали:

S>Есть такая интересная функция.


S>
S>function StrToDateTime(const S: string; const FormatSettings: TFormatSettings): TDateTime; overload;
S>


[scip]
А самому розродиться и написать?
Причина почему не написано — банальна. .НЕт затевался с поддержкой юникода, интернационала
А делфи нет. К тому же поддерживать все извраты — уж извольте.
И напоследок, в хелпе сказано что она поддерживает? нет? так что же критикуете. Универсально написать нельзя
... << RSDN@Home 1.2.0 alpha rev. 719>>
Re[2]: опять StrToDateTime или о чем думали в борланде?
От: Spaun2002 Россия  
Дата: 20.08.07 11:59
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

OV>А самому розродиться и написать?

OV>Причина почему не написано — банальна. .НЕт затевался с поддержкой юникода, интернационала
OV>А делфи нет. К тому же поддерживать все извраты — уж извольте.
OV>И напоследок, в хелпе сказано что она поддерживает? нет? так что же критикуете. Универсально написать нельзя

Ну а при чем здесь юникод-то? Эта функция даже текущую локаль не понимает.
А универсальную функцию написать можно. Для этого все необходимое есть в FormatSettings. И я собственно свою реализацию и написал.
Не понимаю я только, почему это в борланде не сделали? Сложно им это было чтоли или лениво?
Re: опять StrToDateTime или о чем думали в борланде?
От: Spaun2002 Россия  
Дата: 20.08.07 12:49
Оценка:
Кстати, сопутствующий вопрос: Никто не знает, как вытащить границу лет для представления года двумя цифрами. Т.е. когда 30ый год будет считаться 1930 а когда 2030. В реестре есть ключ HKEY_CURRENT_USER/Control Panel/International/Calendars/TwoDigitYearMax но он существует не всегда. Есть ли возможность через API или COM вытащить эту границу?
Re[2]: опять StrToDateTime или о чем думали в борланде?
От: Alex.Che  
Дата: 20.08.07 12:54
Оценка:
Привет, 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 или о чем думали в борланде?
От: a18 Россия  
Дата: 20.08.07 15:00
Оценка:
Здравствуйте, Spaun2002, Вы писали:

S>Есть такая интересная функция.

S>
S>function StrToDateTime(const S: string; const FormatSettings: TFormatSettings): TDateTime; overload;
S>

S>Проблема в том, что она не работает. И вот почему:

Кстати, а с какой целью вы её используете?
По своему опыту, напоровшись в детстве на пару граблей с DateTimeToStr/StrToDateTime, клятвенно пообещал себе никогда их больше не использовать, а для хранения даты/времени в текстовом виде применять фиксированный формат (например, ISO).
Пока удаётся этот обет держать, и уже десяток раз убедился в правильности этого подхода.
Re[2]: опять StrToDateTime или о чем думали в борланде?
От: Spaun2002 Россия  
Дата: 20.08.07 15:09
Оценка:
Здравствуйте, a18, Вы писали:

a18>Кстати, а с какой целью вы её используете?

a18>По своему опыту, напоровшись в детстве на пару граблей с DateTimeToStr/StrToDateTime, клятвенно пообещал себе никогда их больше не использовать, а для хранения даты/времени в текстовом виде применять фиксированный формат (например, ISO).
a18>Пока удаётся этот обет держать, и уже десяток раз убедился в правильности этого подхода.

Я бы с радостью избавился от подобного представления дат. Но к сожалению этого нельзя сделать. Смесь из DevExpress + различные компоненты доступа + использование программы в разных странах не оставляют места для маневров.
Re[3]: опять StrToDateTime или о чем думали в борланде?
От: Spaun2002 Россия  
Дата: 20.08.07 15:12
Оценка:
Здравствуйте, Alex.Che, Вы писали:

AC>Если ты его не видишь чистА визуально, то это не означает, что для него нет дефолтного значения.


Я нисколько не сомневаюсь, что это значение есть. И если установленное в системе не отличается от дефолтного, то этот раздел не создается.
Я видимо не правильно выразился ранее: это не ключ, это раздел. А каким образом можно прочитать значения ключей из несуществующего раздела мне неизвестно.
Re: опять StrToDateTime или о чем думали в борланде?
От: Аноним  
Дата: 20.08.07 15:26
Оценка:
GetLocaleFormatSettings() спасает?
Re[3]: опять StrToDateTime или о чем думали в борланде?
От: a18 Россия  
Дата: 20.08.07 17:07
Оценка:
Здравствуйте, Spaun2002, Вы писали:

S>Я бы с радостью избавился от подобного представления дат. Но к сожалению этого нельзя сделать. Смесь из DevExpress + различные компоненты доступа + использование программы в разных странах не оставляют места для маневров.


Жуть. Мои соболезнования.

Посмотрел в "Королевстве" — народ то же самое пишет (что реализован только короткий формат):
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=32579

Кстати, возможно, программисты Борланда поступили мудро — лично я бы не рискнул брать ответственность за корректное преобразование строковых дат с учётом особенностей разных языков — хотя бы потому, что в том же Королевстве очень часто задаётся вопрос — как сменить вывод даты с "20 август 2007" на "20 августа 2007 г." Т.е. обратное преобразование в общем случае будет похоже на разгадку шифра (кстати, интересно, как эти вариации .NET переварит), а учитывая, что, к примеру, строка "01/02/07" для американца и британца обозначает совершенно разные даты, проще застрелиться
Re[2]: опять StrToDateTime или о чем думали в борланде?
От: Spaun2002 Россия  
Дата: 21.08.07 04:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>GetLocaleFormatSettings() спасает?


Нет. Как я писал в начале, нативная борландовая функция забивает на все, что записано в FormatSettings кроме DateSeparator.
Re[4]: опять StrToDateTime или о чем думали в борланде?
От: OdesitVadim Украина  
Дата: 21.08.07 08:20
Оценка: :)
Здравствуйте, a18, Вы писали:

a18> а учитывая, что, к примеру, строка "01/02/07" для американца и британца обозначает совершенно разные даты, проще застрелиться

Вот вот. Поэтому один с первых релизов Word'а вышел 11/11/9х (год точно не помню). Менеджмент долго спорил как правильно дату вписать. А всё решил главный программист.
... << RSDN@Home 1.2.0 alpha rev. 719>>
Re: опять StrToDateTime или о чем думали в борланде?
От: Spaun2002 Россия  
Дата: 22.08.07 06:10
Оценка:
Если кому интересно, то Функция GetLocaleFormatSettings еще и неправильно получает формат записи времени. Вернее получает она его правильно, но потом меняет на тот, который ей нравится, а именно на h:mm:ss (AMPM). В некоторых странах время записывается через точку, а не двоеточие...
Re: опять StrToDateTime или о чем думали в борланде?
От: Bedazzle  
Дата: 03.10.07 09:21
Оценка:
Здравствуйте, Spaun2002, Вы писали:

S>Есть такая интересная функция.


S>
S>function StrToDateTime(const S: string; const FormatSettings: TFormatSettings): TDateTime; overload;
S>



S>Проблема в том, что она не работает.


http://community.livejournal.com/ru_delphi/158938.html
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.