Delphi DateTimeFormat возвращает неправильный год - PullRequest
2 голосов
/ 15 апреля 2010

У меня есть форма, которая позволяет пользователям вводить дату рождения:

т.е. 4/16/40

Затем, когда пользователь обрабатывает форму, есть функция, которая проверяет ее длину, добавляет начальные нули, анализирует дату и затем использует FormatDateTime, чтобы просто вернуть год рождения:

strTemp := strPostedByDOB;
If Length(strTemp) = 5
  then strTemp = '0' + strTemp;
if Length(strTemp) = 6 
  then begin
    strTemp := Copy(strTemp, 1 ,2) + '/' + copy(strTemp, 3, 2) + '/' + Copy(strTemp, 5, 2);
    strTemp := FormatDateTime('YYYY', StrToDate(strTemp));
end
else strTemp := EmptyStr;

с использованием этого кода strTemp рассчитывается как 2040 вместо 1940. Может кто-нибудь помочь мне понять, как заставить его отображать 1940 в strTemp? Нужно ли менять форму, чтобы принять четырехзначный год?

Спасибо, Лесли

Ответы [ 2 ]

11 голосов
/ 15 апреля 2010

Лучший вариант - принимать только 4-значные годы, но RTL поддерживает изменение способа обработки 2-значных дней. Глобальная переменная TwoDigitYearCenturyWindow или поле TFormatSettings.TwoDigitYearCenturyWindow контролируют это. Документация RTL гласит:

TwoDigitYearCenturyWindow - определяет, какой век добавляется к двузначным годам при преобразовании строковые даты в числовые даты. Это значение вычитается из текущего года до извлечения века. Это может быть использовано для продления срока службы существующих приложений, которые неразрывно связаны с вводом данных двухзначного года. Лучшее решение проблем 2000 года (2000 г.) - не принимать 2-значные годы вообще - для ввода данных требуется 4-значные годы, чтобы устранить неясности столетия.

Примеры:

Current TwoDigitCenturyWindow  Century  StrToDate() of:
Year    Value                  Pivot    '01/01/03' '01/01/68' '01/01/50'
-------------------------------------------------------------------------
1998    0                      1900     1903       1968       1950
2002    0                      2000     2003       2068       2050
1998    50 (default)           1948     2003       1968       1950
2002    50 (default)           1952     2003       1968       2050
2020    50 (default)           1970     2003       2068       2050

Так что, если вы анализируете только дни рождения, вы можете установить TwoDigitCenturyWindow в 99 или 100, и он всегда будет давать более старые даты.

5 голосов
/ 15 апреля 2010

Да! Десять лет спустя мы все еще сталкиваемся с ошибкой 2000 года. Вероятно, лучше явно указать четырехзначную дату.

Но если вы этого не сделаете, вам нужен какой-то код, который принимает решение, если он получает год из двух цифр. Например, если он меньше текущего года (10), то это число 2000, в противном случае это число 1900. Это имеет смысл для дат рождения, хотя это, конечно, сработает, если вы зарегистрируете кого-то старше 100 лет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...