在C#中,最简单的减法时间的方法是什么?

44

我正在尝试制作一个可以帮助我制作工作时间表的工具。解决以下问题最简单的方法是什么?

  • 8:00am+5小时=1:00pm
  • 5:00pm-2小时=3:00pm
  • 5:30pm-45分钟=4:45pm

等等。

7个回答

81

由于DateTime.Add(TimeSpan)支持正数和负数时间跨度,因此可以使用它来完成所有这些操作。

DateTime original = new DateTime(year, month, day, 8, 0, 0);
DateTime updated = original.Add(new TimeSpan(5,0,0));

DateTime original = new DateTime(year, month, day, 17, 0, 0);
DateTime updated = original.Add(new TimeSpan(-2,0,0));

DateTime original = new DateTime(year, month, day, 17, 30, 0);
DateTime updated = original.Add(new TimeSpan(0,-45,0));
或者您还可以类比使用DateTime.Subtract(TimeSpan)方法。

好的,那我到底哪里出错了呢?我加了一个日期时间选择器,并把它的值赋给了一个日期时间变量。现在数学方法没有显示出来。 - Sinaesthetic
@Sinaesthetic - 可能值得发布一些代码,这是一个与日期时间算术略有不同的问题。 - Steve Townsend
使用DateTimePicker时,请记住它可以显示日期或时间,但维护由两者组成的值...如果您正在使用Value属性,则可能需要先减去其中一个组件。 - Ian
在第三个例子中,楼主想要减去45分钟,为什么在这个答案中我没有看到负值?这是一个错误吗? - Yakov .P

32

请查看所有DateTime方法:http://msdn.microsoft.com/en-us/library/system.datetime.aspx

Add 返回一个新的DateTime对象,该对象将指定TimeSpan的值添加到此实例的值中。

AddDays 返回一个新的DateTime对象,该对象将指定天数添加到此实例的值中。

AddHours 返回一个新的DateTime对象,该对象将指定小时数添加到此实例的值中。

AddMilliseconds 返回一个新的DateTime对象,该对象将指定毫秒数添加到此实例的值中。

AddMinutes 返回一个新的DateTime对象,该对象将指定分钟数添加到此实例的值中。

AddMonths 返回一个新的DateTime对象,该对象将指定月数添加到此实例的值中。

AddSeconds 返回一个新的DateTime对象,该对象将指定秒数添加到此实例的值中。

AddTicks 返回一个新的DateTime对象,该对象将指定刻度数添加到此实例的值中。

AddYears 返回一个新的DateTime对象,该对象将指定年数添加到此实例的值中。


6
针对所有阅读此内容的人:您可以使用上述函数并使用负数值进行减法运算,只要实例未初始化为DateTime.MinValue。 - Kimmax

11

你好,如果你想从DateTime中减去整数值,那么你需要编写类似这样的代码:

DateTime.Now.AddHours(-2)

在这里,我从当前日期和时间中减去了2小时


9
这也可以运行:

System.DateTime dTime = DateTime.Now();

// tSpan is 0 days, 1 hours, 30 minutes and 0 second.
System.TimeSpan tSpan = new System.TimeSpan(0, 1, 3, 0); 

System.DateTime result = dTime + tSpan;

减去一年:

DateTime DateEnd = DateTime.Now;
DateTime DateStart = DateEnd - new TimeSpan(365, 0, 0, 0);

7
使用TimeSpan对象来记录初始时间元素,并使用方法如AddHoursAddMinutes。要减去3小时,您需要执行AddHours(-3)。要减去45分钟,您需要执行AddMinutes(-45)

使用TimeSpan对象来捕获您的初始时间元素 - 您是指DateTime吗? - Rawling
我指的是 System.TimeSpan 类型。 - Fadrian Sudaman
1
但是初始时间是一个瞬间,例如晚上8点,而不是一个时间跨度,例如45分钟。(还要道歉,我刚意识到这是一篇多年前的帖子。) - Rawling
1
嗯...如果你真的不在意日期,我想那样做还可以,但从语义上讲,这并不是时间跨度所代表的,而且这会大大提高你的WTFpm评分。 - Rawling
不反对你的评论 :) 就像你说的,我很久以前回答过这个帖子。那时,我 spontanously 回答了这个问题,仅仅是关于在时间上执行简单操作。 - Fadrian Sudaman
显示剩余2条评论

1

试一下

namespace dateandtime
{

    class DatesTime
    {

        public static DateTime Substract(DateTime now, int hours,int minutes,int seconds)
        {
            TimeSpan T1 = new TimeSpan(hours, minutes, seconds);
            return now.Subtract(T1);
        }


        static void Main(string[] args)
        {
            Console.WriteLine(Substract(DateTime.Now, 36, 0, 0).ToString());

        }
    }
}

-1

TimeLeftToOpen = new TimeSpan(TimeLeftToOpen.Hours, TimeLeftToOpen.Minutes, TimeLeftToOpen.Seconds - 1);


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接