C#如何在不使用Date / DateTime / TimeSpan的情况下计算日期之间的天数?

时间:2017-01-05 15:09:20

标签: c# datetime timespan

我有面试任务要做。我需要计算日期之间的日期数,而不使用Date / DateTime / TimeSpan类来完成。

如何仅使用String类?

最诚挚的问候 // vamone

2 个答案:

答案 0 :(得分:2)

将日期转换为a Julian day number更为正常:

// This is a standard formula for conversion.
// See the Wikipedia page on Julian days for more information.

public static long ToJulian(int year, int month, int day)
{
    if (month < 3)
    {
        month = month + 12;
        year = year - 1;
    }

    return  day + (153 * month - 457) / 5 + 365 * year + (year / 4) - (year / 100) + (year / 400) + 1721119;
}

要调用您需要先将日期字符串解析为月,日和年:

    public static long ToJulian(string mdy)
    {
        var split = mdy.Split('/');
        return ToJulian(int.Parse(split[2]), int.Parse(split[0]), int.Parse(split[1]));
    }

然后,您可以将两个日期转换为Julian格式并减去它们以查找天数差异。

这是一个示例,显示与使用DateTime和TimeSpan相比,Julian的结果相同:

    static void Main()
    {
        string date1 = "5/31/1961";
        string date2 = "1/5/2017";

        long diff1 = ToJulian(date2) - ToJulian(date1);

        Console.WriteLine("diff1 = " + diff1);

        long diff2 = (long)(
            DateTime.Parse(date2, CultureInfo.InvariantCulture) - 
            DateTime.Parse(date1, CultureInfo.InvariantCulture))
            .TotalDays;

        Console.WriteLine("diff2 = " + diff2);
    }

答案 1 :(得分:0)

你不能不知道日期与哪种文化联系在一起。

您必须首先了解我们正在讨论的文化,然后您可以使用DateFormat对象识别分隔符和日期部分。

然后只使用传递日期分隔符的Split方法,这样您就可以检索每个日期部分并执行计算。

但你还必须定义月份持续时间(28天,30天,31天),更不用说闰年了。

要确定leap-years,您可以实施以下算法

  

如果(年份不能被4整除)那么(这是常见的一年)
  其他如果(年份不能被100整除)那么(这是闰年)
  其他如果(年份不能被400整除)那么(这是常见的一年)
  其他(这是闰年)

持续数月,声明一个包含12个项目的数组,用于存储月份持续时间,并使用月份数作为索引来检索每个月的长度。