-
Не нравится мне код подфункции 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; По-моему, так корректнее. А вы как думаете?
-
Простите, чуть поторопился задавать вопрос. Провтыкал в код, осознал, что GetYear как раз на случаи двух или однозначного формата года. Тем более странная реализация. Возможно, наиболее корректно было бы так? OldDate := Abs( Result - STNow.wYear mod 100 ) > 50;
-
Скорее всего правильно OldDate := (Result >= 50) and (Result < 100); Тогда 90 -> 1990, 60 -> 1960, 10 -> 2010, для XXI текущего века. Не было протестировано как следует.
-
Да, Владимир, ваш вариант тоже хорош (а еще и проще для исполнения процессором). Но вдруг программы доживут до 50-го?..
-
Думаю, после 2050 уже наверняка заставят год вводить/выбирать полностью. Это временная заплатка, для совместимости со старыми программами, в которых год хранился не полный. И сейчас в некоторых фоксовских программах (Visual FoxPro 5) проблема есть иногда - не удается выбрать год 2000 и выше, упорно вводится 1910.
-
а вот интересно, кому пришла в голову великая идея в 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 ) );
и вообще, локали разные бывают....
|