处理 Y2K 日期转换的首选方法?

Posted

技术标签:

【中文标题】处理 Y2K 日期转换的首选方法?【英文标题】:Preferred method for handling Y2K date conversions? 【发布时间】:2009-06-26 17:18:21 【问题描述】:

是否有将 2 位数年份转换为 4 位数年份的首选算法?

我有一个 2 位数的出生日期(以及月份和日期),我想将其转换为 C# DateTime。显然,出生日期不可能是未来,但是 .NET 中是否存在将 2 位数年份转换为 4 位数年份的现有工具?

【问题讨论】:

你迟到了大约九年,以防你没有注意到。 并非我必须与之交谈的每个系统都使 Y2K 兼容。并不是每个系统都能够兼容千年虫。 【参考方案1】:
static int GetFourDigitYear(int year, int maxYear) 

    System.Globalization.GregorianCalendar cal = 
          new System.Globalization.GregorianCalendar();
    cal.TwoDigitYearMax = maxYear;
    return cal.ToFourDigitYear(year);

maxYear 应该是当前的四位数年份。


编辑:OP的解决方案:

static int GetFourDigitYear(int year, int pivot) 

    System.Globalization.GregorianCalendar cal = 
          new System.Globalization.GregorianCalendar();
    cal.TwoDigitYearMax = new DateTime.Year + (100-pivot);
    return cal.ToFourDigitYear(year);

【讨论】:

一个类似于这个的静态函数最终成为我的解决方案,除了我传递了一个枢轴,而不是一年。对于出生日期,轴心点是 100 年前。【参考方案2】:

各种系统根据其基础数据要求使用不同的断点日期。

在您的情况下,假设 00 到 09 年是 2000+,而任何其他值(10 到 99)是 1900+,这很可能是安全的

您必须问自己的问题是:您的系统中当前有 100 岁以上的人作为记录的可能性有多大。

您应该只执行一次此计算,将其存储起来,并使用 4 位数的年份让您的所有代码继续前进。

【讨论】:

附带说明,此链接 (theiet.org/factfiles/it/dates.cfm?type=pdf) 列出了从 2001 年到 2100 年可能导致各种系统出现问题的潜在日期。【参考方案3】:

我会想到,如果一个人可能在 2007 年 1 月 3 日出生,那么他们在 100 年前一周的同一天出生的可能性略低于 1/7。如果您不喜欢这个概率太高,那么我怀疑是否有一种很好的方法可以自动执行此操作,除非您还存储了他们的年龄。

编辑:当然,有一个公式(从算法上知道日历是如何工作的)可以降低这种概率......但最后,如果你不存储它们,你仍然可能会得到一些错误的结果年龄。

编辑2:当然,如果你有他们的年龄,那么你就不需要日历算法。

【讨论】:

以上是关于处理 Y2K 日期转换的首选方法?的主要内容,如果未能解决你的问题,请参考以下文章

转换日期格式:2 位年份到 4 位年份

oracle中如何转换时间格式

在 pyspark 中转换或处理日期数据类型的最佳方法是啥

将本地时间转换为用户首选时区,将用户首选时区转换为 GMT

哪个 JS 日期时间选择器正确处理 DST 转换?

将 UTC 日期时间全局转换为用户指定的本地日期时间