有人能告诉我如何在不使用.net日期时间和时间戳类的情况下计算两个日期之间的差异吗?
由于
答案 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%,但我相信函数对字符串或对象日期参数有重载。