2010-04-15 4 views
2
года

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

т.е. 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? Нужно ли мне менять форму, чтобы принять 4-значный год?

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

+3

Y2K ошибка. Попросите четырехзначные годы. Во всяком случае, с 2000 года большинство людей (по крайней мере здесь) используют четыре цифры лет. – AlexV

+1

Ваша форма должна использовать элемент управления TDateTimePicker. Затем вся проблема исчезает, ваша программа не должна угадывать, и дата отображается и редактируется с использованием настроек формата пользователя, настроенного пользователем. –

ответ

11

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

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

Примеры:

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, и он всегда будет давать более старые даты.

+0

отлично поработал! – Leslie

+0

Это предполагает по крайней мере Delphi 4 из памяти (я знаю, что D3 всегда ставит 2-значные годы в текущем веке - мне пришлось исправить код для y2k в нем) –

5

Оп! Спустя десять лет после этого мы все еще сталкиваемся с ошибкой Y2K. Вероятно, лучше всего явно указать 4-значную дату.

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

+0

Всё зависит от меня. Если вы ожидаете, что людям будет 18 или выше, вы можете точно настроить порог на <текущий год> - 18 или около того. –

+0

для изменения ввода в 4-значный год понадобится куча изменений кода ... отлично работает TwoDigitCenturyWindowValue. – Leslie

Смежные вопросы