asp.net中的日期差异

时间:2009-05-29 16:12:43

标签: .net datetime

有人能告诉我如何在不使用.net日期时间和时间戳类的情况下计算两个日期之间的差异吗?

由于

4 个答案:

答案 0 :(得分:3)

如果我无法使用内置类型,我会尝试找到另一个.NET日期/时间API。我怀疑我找不到一个,因为任何理智的人都会使用内置的。

如果它真的只是一个日期的情况,我想真的不需要完整的日期/时间API。无论你进入“自某个时代以来的日子”(例如1970年1月1日),你只需进行正常的减法。

小心闰年 - 如果你需要应对几个世纪以来奇怪的日历变化,事情会变得更加有趣。

示例代码假设格式为“yyyyMMdd”,没有进行任何错误检查,没有处理1900年之前的日期,并且根本不担心效率:

using System;

struct Date
{
    readonly int year;
    readonly int month;
    readonly int day;

    public Date(int year, int month, int day)
    {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public static Date Parse(string text)
    {
        return new Date(int.Parse(text.Substring(0, 4)),
                        int.Parse(text.Substring(4, 2)),
                        int.Parse(text.Substring(6, 2)));
    }

    // Days since first Jan 1st 1900
    public int DaysSinceEpoch
    {
        get
        {
            int days = 0;
            for (int i = 1900; i < year; i++)
            {
                days += IsLeapYear(i) ? 366 : 365;
            }
            for (int i = 1; i < month; i++)
            {
                days += GetMonthLength(i, year);
            }
            days += day - 1;
            return days;
        }
    }

    private static readonly int[] MonthLengths = 
    { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    private static int GetMonthLength(int month, int year)
    {
        return MonthLengths[month-1] + 
            ((IsLeapYear(year) && month == 2) ? 1 : 0);
    }

    private static bool IsLeapYear(int year)
    {
        // http://en.wikipedia.org/wiki/Leap_year
        if ((year % 4) != 0) return false;
        if ((year % 400) == 0) return true;
        if ((year % 100) == 0) return false;
        return true;
    }
}

class Test
{
    static void Main(string[] args)
    {
        Console.WriteLine(DateDiff("19040301", "19050301")); // 365
        Console.WriteLine(DateDiff("19040201", "19050201")); // 366
        Console.WriteLine(DateDiff("19760619", "20090529")); // I feel old
    }

    static int DateDiff(string first, string second)
    {
        Date firstDate = Date.Parse(first);
        Date secondDate = Date.Parse(second);
        return secondDate.DaysSinceEpoch - firstDate.DaysSinceEpoch;
    }
}

答案 1 :(得分:2)

如果你不能使用DateTime,你有什么?字符串?在这种情况下,使用DateTime.Parse()变体之一 * 或Convert.ToDateTime()并在那里进行比较。这是唯一正确的方法。还有别的,我们需要更多的信息。

* DateTime.Parse(), DateTime.TryParse(), DateTime.ParseExact(), or DateTime.TryParseExact().

答案 2 :(得分:1)

根据评论,我选择将日期时间存储为自1901年1月1日以来的时钟周期数。现在,它只需从另一个中减去一个,除以每秒钟的时钟周期,并进一步除以适合你想要测量的时间单位的系数(60分钟,3600小时,3600 * 24天等)

答案 3 :(得分:1)

我敢打赌,面试你的人是VB开发人员,并希望你回答使用内置的VB datediff函数(Microsoft.VisualBasic.DateAndTime.DateDiff)。我不是100%,但我相信函数对字符串或对象日期参数有重载。