2010-04-15 67 views
2

我有一个表单,允许用户输入出生日期:德尔福DateTimeFormat返回错误年

即:40年4月16日

然后,当用户进程的形式存在的,检查的功能是长度,增加了前导零,解析日期,然后使用的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年计算的任何人都可以帮我找出如何使它在strTemp中显示1940年?我必须将表格更改为接受4位数的年份吗?

感谢, 莱斯利

+3

Y2K错误。要求四位数年份。无论如何,自2000年以来,大多数人(至少在这里)使用四位数年份。 – AlexV 2010-04-15 18:15:46

+1

您的表单应使用TDateTimePicker控件。然后整个问题消失,您的程序不必猜测,并且使用用户的OS配置的格式首选项显示和编辑日期。 – 2010-04-16 01:49:13

回答

11

最好的选择是只接受4位数的年份,但RTL确实支持更改处理2位数日期的方式。全局变量TwoDigitYearCenturyWindow,或者TFormatSettings.TwoDigitYearCenturyWindow字段来控制这个。该RTL文件说:

TwoDigitYearCenturyWindow - 确定转换 字符串日期数字的日期时,什么世纪被添加到两位数年。在提取世纪之前从当年减去此值。这可以用来延长与2位数年份数据输入密切相关的现有应用程序的生命周期。 2000年(Y2k)问题的最佳解决方案是不接受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,它总是会给旧的日期。

+0

非常感谢! – Leslie 2010-04-15 18:59:51

+0

这个假设至少从内存中的德尔福4(我知道D3总是在当前世纪投入2位数字 - 我不得不修复一些代码为Y2K) – 2010-04-16 00:19:37

5

没错!事实发生十年后,我们仍然遇到了千年虫问题。最好明确要求4位数的日期。

但是,如果你不这样做,你需要某种代码来判断它是否收到2位数的年份。例如,如果它小于当前年份(10),那么它是2000年的数字,否则是1900年的数字。这对于生日是有意义的,尽管如果你注册了100岁以上的人,它当然会绊倒。

+0

这取决于。如果你预计人数在18岁或以上,你可以将门槛调整到<当年> - 大约18岁左右。 – 2010-04-15 18:32:48

+0

它需要一堆代码更改才能将输入更改为4位数的年份... TwoDigitCenturyWindowValue完美工作。 – Leslie 2010-04-15 19:00:25