C# 我如何减去两个日期?
这是我的密码:C# 我如何减去两个日期?,c#,winforms,C#,Winforms,这是我的密码: DateTime date1 = new DateTime(byear, bmonth, bday, 0, 0, 0); DateTime datenow = DateTime.Now; DateTime date2 = datenow - date1 在最后一行中,我遇到了以下错误: 错误1无法将类型“System.TimeSpan”隐式转换为“System.DateTime” 如何减去两个日期?关键是,如果你想一想,将一个日期减去另一个日期不应该产生一个日期,它应该产生一
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()时发生的情况 这将使您当前的代码正常工作 另一方面,如果您想从您的日期减去,比方说,一年,您可以使用:
DateTime oneYearBefore = DateTime.Now.AddYears(-1); //that is, subtracts one year
日期比较的结果是TimeSpan,而不是DateTime值 您要执行以下操作:
TimeSpan result = datenow - date1;
.Subtract有两个重载。一个接受DateTime并返回TimeSpan,另一个接受TimeSpan并返回DateTime
换句话说,如果你从一个日期中减去一个日期,你就会得到时间跨度差。否则,如果从日期中减去时间跨度,则会得到一个新日期。如前所述,date-date为您提供的是时间跨度,而不是日期时间。如果需要日期时间,请使用
AddDays(-1)
,如所示:
DateTime subtractedDate = date1.AddDays(-1);
这不完全是对你问题的回答,但我更喜欢使用
var
而不是用类型来注释变量<代码>varIMO使代码看起来更干净
以下是带有var
s的代码片段:
var date1 = new DateTime(byear, bmonth, bday, 0, 0, 0);
var datenow = DateTime.Now;
var date2 = datenow - date1;
编辑:
对于具有var的C#开发人员来说,这是一种糟糕的心态:
[原件]
我广泛使用var。有
批评认为这削弱了
代码的可读性,但没有
支持这一主张的论据
诚然,这可能意味着它不是
清楚我们正在处理的类型。
那又怎么样?这实际上就是我们的观点
解耦设计。在处理
接口,您显然不是
对变量的类型感兴趣。
var更进一步,没错,但是
我认为这个论点仍然是正确的
从可读性的角度来看也是如此:
程序员实际上不应该是
对变量的类型感兴趣
而是变量的作用。
这就是为什么微软也称之为类型
推断“鸭子类型”
那么,当我
使用var声明它?很简单,是的
不管IntelliSense告诉我什么
做关于C#那有什么理由吗
忽略IDE没有达到的目标
现实。实际上,每个C#代码都是
在支持
智能感知
如果我使用的是var声明的变量
弄不清楚变量是什么
有,有东西
我的代码根本错误。变量
不是原因,它只会使
症状明显。不要责怪那个人
信使
现在,C#团队发布了一个编码
说明var只应
用于捕获
创建
匿名类型(因为在这里,我们有
没有真正的var替代方案)。好,
去他妈的。只要C队
没有给我一个合理的理由
这个指导方针,我将不予理睬
这是因为在我的专业和
个人观点,这纯粹是胡说八道。
(对不起,我没有链接到
有关指引。)
事实上,有一些
(表面上)很好地解释了
为什么不应该使用var,但我仍然
我相信他们大错特错了。拿
“可搜索性”的例子是
作者声称,var使其变得困难
搜索MyType所在的位置的步骤
用过。正确的。接口也是如此。
事实上,我为什么想知道
在哪里使用该类?我可能是
对它在哪里更感兴趣
已实例化,但仍将
可搜索,因为在某个地方
必须调用构造函数(即使
这是间接完成的,类型名
必须在某处提及)-
康拉德·鲁道夫
你能澄清一下你想计算什么吗?在C#或现实生活中,任何两个日期之间的差异都是一个时间跨度。如果你想计算年龄,那么你想要的是他们出生后的时间跨度。将日期2更改为
Timespan age = datenow - date1;
您在代码中正确地减去了两个日期。发生的事情是,你期望两个日期之间的差异是另一个日期,事实并非如此 正如其他海报所注意到的,您会得到一个
TimeSpan
。从你的变量名中我感觉到你在试图找出某人的年龄
年龄不是日期,而是持续时间。仔细阅读TimeSpan
对象,你会发现它正确地表达了你想要的想法
我不是0029-01-01岁,我是29岁。(今天不是我的生日,但假设是为了简单的数学。)
如果您试图在控件中显示某人的年龄,而该控件需要一个日期时间
,则可能是使用了错误的控件。尝试使用勾号
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<DateTime>().Date;
DateTime? Enddate = cEndDate.GetValue<DateTime>().Date;
TimeSpan diff = Enddate.GetValue<DateTime>()- Startdate.GetValue<DateTime>() ;
txtDayNo.Text = diff.Days.GetValue<string>();
DateTime?Startdate=cStartDate.GetValue().Date;
约会时间?Enddate=cEndDate.GetValue().Date;
TimeSpan diff=Enddate.GetValue()-Startdate.GetValue();
txtDayNo.Text=diff.Days.GetValue();
时间跨度示例:
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
,避免这些愚蠢的“键入”问题呢?@Rahul:也许不使用var是一件非常好的事情。他显然仍然不太明白事情是如何运作的。使用var只会对他隐瞒这个事实,依我看,这不是一件好事。你期望的结果是什么?是年龄吗?如果是这样,则可以使用TimeSpan对象来获取该值。所以使用它:)当您将var设置为new时,使用var是一件很简单的事情
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);
}