Delphi DateTimeFormat返回错误的一年

Les*_*lie 2 delphi formatting datetime

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

即: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;
Run Code Online (Sandbox Code Playgroud)

使用此代码,strTemp计算为2040而不是1940.任何人都可以帮我弄清楚如何让它在strTemp中显示1940?我是否必须更改表单以接受4位数年份?

谢谢,莱斯利

Zoë*_*son 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
Run Code Online (Sandbox Code Playgroud)

因此,如果您只解析生日,您应该能够将TwoDigitCenturyWindow设置为99或100,并且它将始终提供更早的日期.


Mas*_*ler 5

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

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