TimeSpan到DateTime的转换


73

我想将Timespan转换为Datetime。我怎样才能做到这一点?

我在Google上找到了一种方法:

DateTime dt;
TimeSpan ts="XXX";

//We can covnert 'ts' to 'dt' like this:

dt= Convert.ToDateTime(ts.ToString());

还有其他方法吗?


4
如果您有一个起点(需要),只需将时间跨度添加到起点即可。
leppie 2012年

我没有开始时间。公开的API仅支持DateTime
Raghav55

4
如果您没有起点或终点,那么您试图做的事情是无意义的。
leppie 2012年

没有参考起点,如何转换?
安德鲁·巴伯

TimeSpan是一个持续时间,它可以是DateTime两个相关部分之间的差异,也可以指示两者之间的差异DateTime,您至少应该知道/假设有什么事情,可以用1 Hour timespan什么来表示?
V4仇杀队

Answers:


102

将TimeSpan转换为DateTime并不是很合逻辑。尝试了解上面的嬉皮士说的话。TimeSpan的持续时间为6天5小时40分钟。不是日期。如果我说6天;你能从中推断出一个日期吗?除非您有参考日期,否则答案是否定的。

因此,如果要将TimeSpan转换为DateTime,则需要一个参考日期。从什么时候开始的6天5个小时?所以你可以这样写:

 DateTime dt = new DateTime(2012, 01, 01);
 TimeSpan ts = new TimeSpan(1, 0, 0, 0, 0);
 dt = dt + ts;

4
您的回答是正确的,谢谢您……但是将TimeSpan转换为DateTime可能是合乎逻辑的,有意义的事情。例如,实体框架将TSQL时间类型(一天中的时间)映射到TimeSpan-从午夜开始的持续时间。要格式化该值,我希望将其设置为DateTime,以便可以使用其排除日期部分的格式化程序方法之一。也许EF应该改用DateTime,但我认为将TimeSpan视为从午夜开始的持续时间至少是合理的。除了我不能改变EF行为。
史蒂夫

1
我正在使用DateTime.Today + ts进行转换,因此,如果您想格式化显示的时间,它将看起来不错
zquanghoangz

刚尝试过ts + dt并得到了“ +运算符无法应用”,所以要小心。该总和不是可交换的。
米哈尔

有时是合乎逻辑的,例如在WPF应用程序中,您拥有使用DateTime的TimePicker控件,但您希望使用时间跨度...
Konrad,

则无需参考日期,因为仅会忽略日期,因此您仅获得小时:分钟部分
Konrad,

30

尽管选择的答案严格正确,但我相信我也了解OP试图解决的问题,因为我遇到了类似的问题。

我有一个TimeSpan,希望将其显示在网格控件中(如hh:mm),但网格似乎无法理解TimeSpan,而只能显示DateTime。OP具有类似的情况,其中仅TimeSpan是相关部分,但不考虑添加DateTime参考点的必要性。

因此,如上所述,我只是简单地添加了DateTime.MinValue(尽管任何日期都可以),当网格将时间跨度作为结果日期的时间部分呈现时,网格随后会将其忽略。


除了图表之外,那也正是我的用例。我需要在X轴上显示经过的时间。
M Granja

16

可以将TimeSpan添加到新的DateTime中以实现此目的。

TimeSpan ts="XXX";
DateTime dt = new DateTime() + ts;

但是如前所述,没有有效的开始日期并不是严格逻辑上的。我遇到了一个只需要时间方面的用例。只要逻辑正确就可以正常工作。


10

您需要参考日期才能有用。

来自http://msdn.microsoft.com/zh-CN/library/system.datetime.add.aspx的示例

// Calculate what day of the week is 36 days from this instant.  
System.DateTime today = System.DateTime.Now;  
System.TimeSpan duration = new System.TimeSpan(36, 0, 0, 0);  
System.DateTime answer = today.Add(duration);  
System.Console.WriteLine("{0:dddd}", answer);  

1
从需要在网格中显示的数据库返回时间值时非常有用的功能!
gchq


0

如果只需要在数据网格或类似标签中显示时间值,则最好的方法是直接将时间转换为日期时间数据类型。

从表1中选择转换(datetime,myTimeField)作为myTimeField


如果您通过核心许可SQL,那么也许让应用服务器执行此转换并保存周期。
Brain2000

0

您还可以使用DateTime.FromFileTime(finishTime),其中finishTme是一个很长的时间,包含一个时间间隔。或FromFileTimeUtc。


-3

一种简单的方法,使用刻度:

new DateTime((DateTime.Now - DateTime.Now.AddHours(-1.55)).Ticks).ToString("HH:mm:ss:fff")

此功能将为您提供日期(无日/月/年)


1
OP希望将Timepan转换为DateTime,您的答案没有解决。
迈克

提示:如果您需要DateTime时间,请执行<DateTime>.TimeOfDay。与日期部分类似,<DateTime>.Date
auhmaan

-3

上述所有问题是,转换返回的时间天数不正确,如在TimeSpan中指定的那样。
使用上面的方法,下面的方法返回3而不是2。

关于如何在TimeSpan参数中保留2天并将其返回为DateTime日的想法?

public void should_return_totaldays()
{
    _ts = new TimeSpan(2, 1, 30, 10);
    var format = "dd";
    var returnedVal = _ts.ToString(format);
    Assert.That(returnedVal, Is.EqualTo("2")); //returns 3 not 2
}

1
运行代码时的实际结果是“ 02”。我能想到的唯一远程解释是_ts未定义为TimeSpan(您未在代码段中声明它),但是您在代码中的注释不正确。将_ts声明为TimeSpan时,它将为持续时间的天部分返回正确的值。
迈克(Mike)

-4

首先,将时间跨度转换为字符串,然后转换为DateTime,然后转换为字符串:

Convert.ToDateTime(timespan.SelectedTime.ToString()).ToShortTimeString();

5
这不是OP建议的吗?他要求的方法不是先转换为字符串。

SelectedTime不存在
MiBol 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.