C#:我如何减去两个日期?

这是我的代码:

DateTime date1 = new DateTime(byear, bmonth, bday, 0, 0, 0); DateTime datenow = DateTime.Now; DateTime date2 = datenow - date1 

在最后一行,我收到此错误:

错误1无法将类型’System.TimeSpan’隐式转换为’System.DateTime’

如何减去两个日期?

那么关键是,如果你想到它,将一个日期减去另一个日期不应该产生一个日期,它应该产生一个时间跨度。 这就是使用DateTime.Subtract()时会发生的情况。

 TimeSpan timeSpan = datenow - date1; //timespan between `datenow` and `date1` 

这将使您当前的代码工作。

另一方面,如果您要减去,比如说,从您的约会起一年后,您可以使用:

 DateTime oneYearBefore = DateTime.Now.AddYears(-1); //that is, subtracts one year 

如前所述,date-date为您提供TimeSpan,而不是DateTime。 如果需要DateTime,请使用AddDays(-1)如下所示:

 DateTime subtractedDate = date1.AddDays(-1); 

日期比较的结果是TimeSpan,而不是DateTime值。

你想这样做:

 TimeSpan result = datenow - date1; 

.Subtract有两个重载。 一个接受DateTime并返回TimeSpan,另一个接受TimeSpan并返回DateTime。

换句话说,如果从日期中减去日期,则会得到时差差异。 否则,如果从日期中减去一个时间跨度,则会得到一个新日期。

你能说清楚你在尝试计算什么吗? C#或现实生活中任何两个日期之间的差异都是时间跨度。 如果你想计算年龄,那么你想要的是自出生以来的时间跨度。 将Date2更改为

 Timespan age = datenow - date1; 

您正确地在代码中减去两个日期。 发生了什么事情,你希望两个日期之间的差异是另一个日期,而事实并非如此。

正如其他海报所注意到的那样,你会得到一个TimeSpan 。 从你的变量名称中我得到的感觉是你试图找出某个人的年龄。

年龄不是约会,而是持续时间。 阅读TimeSpan对象,您会发现它正确地表达了您正在寻找的想法。

我不是0029-01-01岁,我今年29岁。 (今天不是我的生日,但假设它是为了简单的数学。)

如果你试图在控件中显示某人的年龄,并且该控件想要一个DateTime你可能正在使用错误的控件来执行它。

尝试使用滴答声……?

 DateTime date1 = new DateTime(1986, 3, 16, 0, 0, 0); DateTime datenow = DateTime.Now; DateTime date2 = new DateTime(datenow.Subtract(date1).Ticks); 

您期望两个日期的差异是不是的日期。 话虽这么说,如果您需要减去一定天数或几个月,可以使用DateTime对象的内置方法(如.AddDays(-1))轻松完成,请注意我使用负数进行减法,你可以申请相反的。 这是一个简单的例子。

  DateTime now = DateTime.Now; // Get the date 7 days ago DateTime sevenDaysAgo = now.AddDays(-7); // Bulk: Get the date 7 days and two hours ago DateTime sevenDaysAndtwoHoursAgo = now.Add(-(new TimeSpan(7, 2, 0, 0))); 

使用此代码:

 DateTime? Startdate = cStartDate.GetValue().Date; DateTime? Enddate = cEndDate.GetValue().Date; TimeSpan diff = Enddate.GetValue()- Startdate.GetValue() ; txtDayNo.Text = diff.Days.GetValue(); 

TimeSpan示例:

 private void Form1_Load(object sender, EventArgs e) { DateTime startdatetime = new DateTime(2001, 1, 2, 14, 30, 0); DateTime enddatetime = DateTime.Now; TimeSpan difference = enddatetime.Subtract(startdatetime); string sdifference = "TotalDays:" + difference.TotalDays + Environment.NewLine; sdifference += "TotalHours:" + difference.TotalHours + Environment.NewLine; sdifference += "TotalMilliseconds:" + difference.TotalMilliseconds + Environment.NewLine; sdifference += "TotalMinutes:" + difference.TotalMinutes + Environment.NewLine; sdifference += "TotalSeconds:" + difference.TotalSeconds + Environment.NewLine; sdifference += "Ticks:" + difference.Ticks + Environment.NewLine; sdifference += "Total:" + difference.Days + " days, " + difference.Hours + " hours, " + difference.Minutes + " minutes, " + difference.Seconds + " seconds and " + difference.Milliseconds + " milliseconds."; TextBox TextBox1 = new TextBox(); TextBox1.Multiline = true; TextBox1.Dock = DockStyle.Fill; TextBox1.Text = sdifference; this.Controls.Add(TextBox1); } 

不完全是你的问题的答案,但我更喜欢使用var而不是用类型注释变量。 var IMO使代码看起来比其他方式更清晰。

这是你的var s代码片段:

 var date1 = new DateTime(byear, bmonth, bday, 0, 0, 0); var datenow = DateTime.Now; var date2 = datenow - date1; 

编辑

对于具有var-is-bad心态的C#开发人员:

[原帖在这里 ]

我广泛使用var。 有人批评这会降低代码的可读性,但没有论据支持这种说法。

不可否认,这可能意味着我们正在处理的类型尚不清楚。 所以呢? 这实际上是解耦设计的重点。 在处理接口时,您显然对变量的类型不感兴趣。 var更进一步,真实,但我认为从可读性的角度来看,论证仍然是相同的:程序员实际上不应该对变量的类型感兴趣,而应该对变量的作用感兴趣。 这就是为什么微软也称类型推断为“鸭子打字”。

那么,当我使用var声明变量时,变量会做什么? 很简单,它可以做任何IntelliSense告诉我的事情。 关于忽略IDE的C#的任何推理都不符合现实。 实际上,每个C#代码都在支持IntelliSense的IDE中编程。

如果我使用var声明的变量并且混淆了变量的用途,那么我的代码就会出现根本性的错误。 var不是原因,它只会使症状可见。 不要责怪信使。

现在,C#团队发布了一个编码指南,声明var只应该用于捕获创建匿名类型的LINQ语句的结果(因为在这里,我们没有真正的替代v​​ar)。 好吧,搞砸了。 只要C#团队没有给我这个指南的合理论据,我就会忽略它,因为在我的专业和个人看来,它是纯粹的胡扯。 (对不起,我没有指向相关指南的链接。)

实际上,有一些(表面上)很好的解释为什么你不应该使用var,但我仍然认为它们在很大程度上是错误的。 以“searchabililty”为例:作者声称var使得搜索使用MyType的地方变得困难。 对。 接口也是如此。 实际上,为什么我想知道课程的使用位置? 我可能更感兴趣的是它实例化的地方,这仍然是可搜索的,因为它的构造函数必须被调用(即使这是间接完成的,类型名称必须在某处提到)。 – 康拉德鲁道夫