关于c#:如何从另一个日期中减去一个日期?

How can I subtract one date from another?

本问题已经有最佳答案,请猛点这里访问。

假设我有两个约会:

日期:现在:#8/10/2013 10:53:46 PM#

第二个日期是文件创建日期:

1
#7/10/2011 9:57:58 PM#

我想做点类似的事情:Date.Now - FileDate

这是我的代码:

1
Dim ddd As TimeSpan = Date.Now - SecondDate

TimeSpan中没有"Year"属性。(年份属性应该是22013 - 2011 = 2,但有天属性-但我必须得到年份和月份)

更新:

谢谢大家,但我创造了一个功能:

2

希望它能帮助别人。


C代码:

2

您不能获得"年"或"月",因为并非所有的年或月都具有相同的日计数。

替代方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var now = DateTime.Now;
var totalYears = now.Year - secondDate.Year;

if (secondDate.Month > now.Month || (secondDate.Month == now.Month && secondDate.Day > now.Day))
{
    totalYears--;
}

var months = now.Month - secondDate.Mont;

if (secondDate.Day > now.Day)
{
    months--;
}

if (months < 0)
{
    months = 12 + months;
}

可以使用datetime.parse("date as a string")将两者转换为datetime对象。然后您将要使用日期时间。减去http://msdn.microsoft.com/en-us/library/8ysw4sby.aspx然后,您将得到您想要的时间跨度,您可以在这里浏览:http://msdn.microsoft.com/en-us/library/system.timespan_methods.aspxtotaldays属性可以除以365得到年份(请注意下面的公平挑战)。几个月的计算将更加复杂。


问题是,对一年没有真正的共同定义。在日历中,一年有365或366天。在银行业,一年有360天等。

根据你的代码,我会说你想要日历年的不同,所以你不能从一个时间跨度(因为时间跨度不知道一年是365天还是366天)。

所以你可以做的是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var years = DateTime.Now.Year - fileDate.Year;

var dayInCurrentYear = fileDate.AddYears(years);

//if the day is later in the year than today's day go back one year
if(dayInCurrentYear > DateTime.Now)
{
   years--;
   dayInCurrentYear = dayInCurrentYear.AddYears(-1);
}

var span = DateTime.Now - dayInCurrentYear;

Console.WriteLine("File was created {0} years and {1} days ago", years, span.TotalDays);

由于TimeSpan结构简单,一年取决于文化和起点和终点,因此TimeSpan中没有年份。这应该有效:

1
2
3
4
5
6
Dim zeroTime As New DateTime(1, 1, 1)
Dim a = #8/10/2013 10:53:46 PM#
Dim b = #7/10/2011 9:57:58 PM#

Dim span As TimeSpan = a - b
Dim years As Integer = (zeroTime + span).Year - 1

你也可以看看乔恩·斯基特的《野田时代》,它支持这个观点。


1
Dim ddd As New DateTime((Date.Now - SecondDate).Ticks)

或者,在JonSkeet的noda时间库中有一个函数。