2012-04-23 151 views
45

我想将Timespan转换为日期时间。我怎样才能做到这一点?TimeSpan转换为DateTime

我发现谷歌的一种方法:

DateTime dt; 
TimeSpan ts="XXX"; 

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

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

是否有任何其他方式做到这一点?

+4

如果你有一个起点(你需要),只是时间跨度添加到开始日期。 – leppie 2012-04-23 07:11:49

+0

我没有开始时间。公开的API仅支持DateTime – Raghav55 2012-04-23 07:14:55

+2

如果您没有开始或结束点,您尝试执行的操作是无意义的。 – leppie 2012-04-23 07:16:51

回答

74

将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; 
+1

您的回答是正确的,我感谢您......但将TimeSpan转换为DateTime _can_是一件符合逻辑的,有意义的事情。例如,Entity Framework将TSQL时间类型(Time-of-day)映射到TimeSpan - 作为自午夜以来的持续时间。要设置值的格式,我想它作为日期时间,所以我可以使用其格式化方法之一,排除日期部分...也许英孚应该使用日期时间,但我认为这是至少有点合理对待TimeSpan作为自午夜以来的持续时间和除此之外,我无法更改EF行为。 – steve 2016-08-22 19:13:01

+1

我使用DateTime.Today + ts进行转换,然后如果你想格式化显示时间,它会看起来很好 – zquanghoangz 2017-05-16 04:50:40

+0

刚刚尝试ts + dt,并得到“+操作符不能应用”,所以要小心。总和是不可交换的。 – Michal 2017-11-23 11:28:39

7

你需要一个参考日期这是有用的。

一个例子来自 http://msdn.microsoft.com/en-us/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); 
+0

从数据库中返回需要在网格中显示的时间值时非常有用的功能! – gchq 2015-09-13 16:04:46

25

虽然选择的答案是完全正确的,我相信我明白了OP尝试,因为我也有类似的问题,以便获得在这里。

我有一个TimeSpan,我希望在网格控件中显示(如hh:mm),但网格似乎并不理解TimeSpan,只有DateTime。 OP有一个类似的场景,其中只有TimeSpan是相关部分,但没有考虑添加DateTime参考点的必要性。

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

+0

这正是我的用例,除了在图表中。我需要在X轴上显示经过的时间。 – 2015-04-09 12:42:39

-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 
} 
+2

使用格式“dd”时的预期结果是“02”。 – Joe 2013-06-09 18:28:12

+1

运行代码时的实际结果是“02”。我能想到的唯一远程解释是_ts没有被定义为TimeSpan(你不会在你的snippit中声明它),但是你在代码中的注释是不正确的。当_ts被声明为TimeSpan时,它将返回持续时间的天数部分的正确值。 – Mike 2015-04-10 03:49:39

-4

首先,时间跨度转换为字符串,然后以日期时间,然后再返回到一个字符串:

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

这与OP建议的不一样吗?他要求的方法不是先转换成字符串。 – Joe 2014-07-17 23:30:59

+0

SelectedTime不存在 – MiBol 2015-02-04 21:03:17

3

时间跨度可以被添加到一个新的日期时间来实现这一目标。

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

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

-3

一个简单的方法,使用蜱:

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

这个功能会给你一个日期(无日/月/年)

+1

OP想要将Timepan转换为DateTime,但您的答案没有解决该问题。 – Mike 2015-04-10 03:53:36

+0

提示:如果您想要'DateTime'时间部分,只需执行' .TimeOfDay'。与日期部分类似,“。日期”。 – auhmaan 2017-06-21 16:03:42

0

如果你只需要在数据网格或标签上显示时间价值类似的,最好的方法是直接在datetime数据类型中进行时间转换。

SELECT CONVERT(日期时间,myTimeField)作为myTimeField FROM表1

0
var StartTime = new DateTime(item.StartTime.Ticks);