我有面试任务要做。我需要计算日期之间的日期数,而不使用Date / DateTime / TimeSpan类来完成。
如何仅使用String类?
最诚挚的问候 // vamone
答案 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个项目的数组,用于存储月份持续时间,并使用月份数作为索引来检索每个月的长度。