这是我的代码:
DateTime date1 = new DateTime(byear, bmonth, bday, 0, 0, 0);
DateTime datenow = DateTime.Now;
DateTime date2 = datenow - date1
在最后一行我收到此错误:
错误1无法将类型'System.TimeSpan'隐式转换为'System.DateTime'
如何减去两个日期?
答案 0 :(得分:19)
关键是,如果你想到它,将一个日期减去另一个日期不应该产生一个日期,它应该产生一个时间跨度。这就是使用DateTime.Subtract()时会发生的情况。
TimeSpan timeSpan = datenow - date1; //timespan between `datenow` and `date1`
这将使您当前的代码正常工作。
另一方面,如果您要减去,比如说,从您的约会起一年后,您可以使用:
DateTime oneYearBefore = DateTime.Now.AddYears(-1); //that is, subtracts one year
答案 1 :(得分:3)
如前所述,date - date为您提供TimeSpan,而不是DateTime。如果您需要DateTime,请使用AddDays(-1)
,如下所示:
DateTime subtractedDate = date1.AddDays(-1);
答案 2 :(得分:1)
日期比较的结果是TimeSpan,而不是DateTime值。
你想这样做:
TimeSpan result = datenow - date1;
答案 3 :(得分:1)
.Subtract有两个重载。一个接受DateTime并返回TimeSpan,另一个接受TimeSpan并返回DateTime。
换句话说,如果从日期中减去日期,则会得到时差差异。否则,如果从日期中减去一个时间跨度,则会得到一个新的日期。
答案 4 :(得分:1)
你能澄清你在尝试计算的内容吗? C#或现实生活中任何两个日期之间的差异都是时间跨度。如果你想计算年龄,那么你想要的是自出生以来的时间跨度。将Date2更改为
Timespan age = datenow - date1;
答案 5 :(得分:1)
您正确地在代码中减去两个日期。发生了什么事情,你希望两个日期之间的差异是另一个日期,而事实并非如此。
正如其他海报所注意到的那样,你得到TimeSpan
。从您的变量名称我得到的感觉是你试图找出某人的年龄。
年龄不是日期,而是持续时间。阅读TimeSpan
对象,您会发现它正确表达了您正在寻找的想法。
我不是0029-01-01岁,我今年29岁。 (今天不是我的生日,但假设这是为了简单的数学。)
如果你试图在某个控件中显示某人的年龄,并且该控件想要DateTime
你可能正在使用错误的控件来执行此操作。
答案 6 :(得分:1)
尝试使用滴答声??
DateTime date1 = new DateTime(1986, 3, 16, 0, 0, 0);
DateTime datenow = DateTime.Now;
DateTime date2 = new DateTime(datenow.Subtract(date1).Ticks);
答案 7 :(得分:0)
您期望两个日期的差异是不是的日期。话虽这么说,如果你需要减去一定天数或几个月,可以使用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)));
答案 8 :(得分: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>();
答案 9 :(得分:0)
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);
}
答案 10 :(得分:-2)
不完全是您问题的答案,但我更喜欢使用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#开发人员:
[原帖[{3}}]
我广泛使用var。有过 批评这减少了 代码的可读性,但没有 支持这种说法的论据。
不可否认,这可能意味着事实并非如此 清楚我们正在处理什么类型。 所以呢?这实际上就是重点 解耦设计。处理时 接口,你显然不是 对变量类型感兴趣。 var更进一步,真实,但是 我认为这个论点仍然存在 同样从可读性的角度来看: 程序员实际上不应该这样 对变量的类型感兴趣 而是变量的作用。 这就是微软也称为类型的原因 推断“鸭子打字。”
那么,当我变量时,变量是做什么的 使用var声明它?很容易,确实如此 无论IntelliSense告诉我什么 确实。关于C#的任何推理 忽略了IDE的缺失 现实。实际上,每个C#代码都是 在支持的IDE中编程 智能感知。
如果我使用的是var声明的变量 并混淆变量是什么 在那里,有一些东西 从根本上说我的代码错了。 VAR 不是原因,它只是使 症状可见。别怪了 信使。
现在,C#团队发布了一个编码 准则说明var应该只 用于捕获a的结果 创建一个LINQ语句 匿名类型(因为在这里,我们有 没有真正的替代var)。好, 拧那个。只要C#团队 没有给我一个合理的论据 这个指导方针,我将无视 因为在我的专业和 个人意见,这是纯粹的胡扯。 (对不起,我没有链接到 有问题的指导原则。)
实际上,有一些 (表面上)很好的解释 为什么你不应该使用var,但我仍然 相信他们基本上是错的。采取 “searchabililty”的例子: 作者声称var使其变得困难 搜索MyType所在的地方 用过的。对。接口也是如此。 实际上,为什么我想知道 使用班级的地方?我可能是 对它的位置更感兴趣 实例化,这仍然是 可搜索因为它的某个地方 必须调用构造函数(即使 这是间接完成的,类型名称 必须在某处提到)。 - 康拉德鲁道夫