2010-04-15 95 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