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

时间:2010-04-12 19:14:58

标签: 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'

如何减去两个日期?

11 个答案:

答案 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语句   匿名类型(因为在这里,我们有   没有真正的替代v​​ar)。好,   拧那个。只要C#团队   没有给我一个合理的论据   这个指导方针,我将无视   因为在我的专业和   个人意见,这是纯粹的胡扯。   (对不起,我没有链接到   有问题的指导原则。)

     

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