我有一个允许用户输入出生日期的表格:
即: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位数的年份?
谢谢, 莱斯利
答案 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岁以上的人时,它会绊倒。