Конференция "KOL" » Str2DateTimeFmt [Delphi, Windows]
 
  • Артём (20.08.10 09:57) [0]
    Не нравится мне код подфункции 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 ) );

    и вообще, локали разные бывают....
 
Конференция "KOL" » Str2DateTimeFmt [Delphi, Windows]
Есть новые Нет новых   [120347   +16][b:0][p:0.001]