处理 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 日期转换的首选方法?的主要内容,如果未能解决你的问题,请参考以下文章