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);

    }