Delphi DateTimeFormat返回错误的一年

时间:2010-04-15 17:58:05

标签: delphi datetime formatting

我有一个允许用户输入出生日期的表格:

即: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.任何人都可以帮我弄清楚如何让它在strTemp中显示1940?我是否必须更改表格以接受4位数的年份?

谢谢, 莱斯利

2 个答案:

答案 0 :(得分: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,并且它总是会提供较旧的日期。

答案 1 :(得分:5)

是的!事实发生十年后,我们仍然遇到了Y2K漏洞。最好明确要求一个4位数的日期。

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