【问题标题】:Detecting Non-Gregorian date format检测非公历日期格式
【发布时间】:2021-09-28 07:10:32
【问题描述】:

我正在使用下面的代码来检测正确的波斯日期格式。

        var formats = new[] { "yyyy/d/M", "yyyy/M/dd", "yyyy/MM/d", "yyyy/MM/dd" };
        DateTime dt;

        if (!DateTime.TryParseExact(date, formats, null, DateTimeStyles.None, out dt))
        {
            correctedDate = date.FixDate();
        }
        else
        {
            correctedText = date;
        } 

关键是某些特定日期会出现问题,例如“1400/02/29”。 我尝试了不同的CultureInfo 和DateTimeStyles,但仍然得到相同的结果。

【问题讨论】:

标签: c# datetime


【解决方案1】:

您是否知道日期“1400/02/29”(我理解为 1400 年,2 月,第 29 天)不存在?
传统上,闰年被称为一年,可以被 4 整除,并且确实有 2 月 29 日这一天。
然而,这并不完全准确:闰年的完整条件是:

  • 能被 400 整除?是 => 闰年。
  • 如果不能被 400 整除,是否能被 100 整除? => 是 => 没有闰年。
  • 如果不能被 400 整除又能被 100 整除,是否能被 4 整除?是 => 闰年。

因此,可以被 100 整除但不能被 400 整除的年份(如 1400)不是闰年,因此日期“1400/02/29”不存在。

因此,您看到的“错误”行为很可能实际上是“正确”行为,因为您的日期错误。

【讨论】:

  • OP 在标题中说“非公历”,由于公历在 1500 年代后期普遍采用,而儒略历中的闰年是每四年一次,没有其他条件,因此有效朱利安约会。并不是说它一定可以在 .NET 的日期时间中表示,但这并不意味着它是一个错误的日期。
  • @Damien_The_Unbeliever:作者说“我给我的程序提供了正确的数据,结果是坏的,所以程序一定是坏的。”,对此我的反应是“你确定你的数据是正确的吗?”。我无意说“尊敬的作者,您的数据有误!”,这只是一个评论。一般这样的评论要放在评论里,但是评论太大了,放不下评论窗口,所以我把它写成了答案。
  • 是的,但我的意思是,您正在应用在 1582 年到 1400 年首次制定的规则。
  • @Damien_The_Unbeliever:你完全正确。我只是想知道计算机是否知道这一点,所见的计算机只是在 400 多年后才发明的 :-)
猜你喜欢
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多