代码之家  ›  专栏  ›  技术社区  ›  Leslie

Delphi日期时间格式返回错误年份

  •  2
  • Leslie  · 技术社区  · 15 年前

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

    IE: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。有谁能帮我弄清楚怎么把它做成1940年的舞台剧吗?我必须更改表格才能接受4位数的年份吗?

    谢谢, 莱斯利

    2 回复  |  直到 15 年前
        1
  •  11
  •   Zoë Peterson RRUZ    15 年前

    你最好的选择是只接受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,它总是给出较旧的日期。

        2
  •  5
  •   Mason Wheeler    15 年前

    是的!十年过去了,我们还是遇到了千年虫。最好明确要求4位数的日期。

    但如果你不这样做,你需要某种代码来判断它是否接受了2位数的年份。例如,如果小于当前年份(10),则为2000,否则为1900。这对生日来说是有意义的,当然,如果你给100岁以上的人登记的话,它会出错。