Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Str2DateTimeFmt [Delphi, Windows]


Артём   (20.08.10 09:57

Не нравится мне код подфункции GetYear в Str2DateTimeFmt.
function GetYear( var S: PKOLChar; NChars: Integer ): Integer;
var STNow: TSystemTime;
   OldDate: Boolean;
begin
 Result := GetNum( S, NChars );
 GetSystemTime( STNow );
 OldDate := Result < 50;
 Result := Result + STNow.wYear - STNow.wYear mod 100;
 if OldDate then Dec( Result, 100 );
end;

Возможно, я неправильно использую саму Str2DateTimeFmt? И двузначный год она не должна обрабатывать нормально? Однако, судя по коду, что-то такое реализовать пытались.
Для себя исправил одну строку:OldDate := Result > STNow.wYear mod 100;По-моему, так корректнее. А вы как думаете?


Артём   (20.08.10 11:05[1]

Простите, чуть поторопился задавать вопрос.
Провтыкал в код, осознал, что GetYear как раз на случаи двух или однозначного формата года. Тем более странная реализация.
Возможно, наиболее корректно было бы так?
OldDate := Abs( Result - STNow.wYear mod 100 ) > 50;


Vladimir Kladov ©   (20.08.10 17:05[2]

Скорее всего правильно OldDate := (Result >= 50) and (Result < 100);
Тогда 90 -> 1990, 60 -> 1960, 10 -> 2010, для XXI текущего века. Не было протестировано как следует.


Артём   (23.08.10 05:24[3]

Да, Владимир, ваш вариант тоже хорош (а еще и проще для исполнения процессором).
Но вдруг программы доживут до 50-го?..


Vladimir Kladov ©   (24.08.10 15:55[4]

Думаю, после 2050 уже наверняка заставят год вводить/выбирать полностью. Это временная заплатка, для совместимости со старыми программами, в которых год хранился не полный. И сейчас в некоторых фоксовских программах (Visual FoxPro 5) проблема есть иногда - не удается выбрать год 2000 и выше, упорно вводится 1910.


GMax   (29.09.11 23:03[5]

а вот интересно, кому пришла в голову великая идея в GetMonth()
написать вначале
GetSystemTime( SD );
в результате функция 1-28 числа работает, а 29-31 в запое  :)
потому как 29-31 февраля не бывает и она любой месяц кроме января февралём считает, так как в C попадает пустота.

я бы всё же поменял на
FillChar(SD, SizeOf(SD), 0); SD.wYear := 2000; SD.wDay := 1;

А великая шаманская магия
C := SystemDate2Str( SD, LOCALE_USER_DEFAULT, dfLongDate, PKOLChar( fmt + '/dd/yyyy/' ) );
MonthStr := Parse( C, '/' );

зачем нужна ?

почему не просто

MonthStr := SystemDate2Str( SD, LOCALE_USER_DEFAULT, dfLongDate, PKOLChar( fmt ) );

и вообще, локали разные бывают....


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо