具体来说,我只需要几小时:分钟但是说我有一个.NET TimeSpan对象,我应该如何将它存储在SQL(CE)数据库中?
我正在尝试整理一个可以帮助我制定工作计划的工具.解决以下问题的最简单方法是什么?
上午8:00 + 5小时=下午1:00
和
下午5:00 - 2小时=下午3:00
和
下午5:30 - :45 = 4:45
等等.
我只想加1天DateTime
.所以我写道:
DateTime date = new DateTime(2010, 4, 29, 10, 25, 00);
TimeSpan t = new TimeSpan(1, 0, 0, 0);
date.Add(t);
Console.WriteLine("A day after the day: " + date.ToString());
Run Code Online (Sandbox Code Playgroud)
我认为结果将是:2010 04 30- 10:25:00
但我仍然得到了初始日期.
怎么了?
我正在使用.Net中的Timespans进行一些数学计算,偶尔总结会产生负时间跨度.当我显示结果时,我无法格式化它以包含负面指示器.
Dim ts as New Timespan(-10,0,0)
ts.ToString()
Run Code Online (Sandbox Code Playgroud)
这将显示"-10:00:00",这很好,但我不想显示秒,所以尝试了这个.
ts.ToString("hh\:mm")
Run Code Online (Sandbox Code Playgroud)
这将返回"10:00"并从前面删除" - ",这是问题的关键.我目前的解决方案是:
If(ts < TimeSpan.Zero, "-", "") & ts.ToString("hh\:mm")
Run Code Online (Sandbox Code Playgroud)
但我希望只使用格式字符串来完成同样的工作.
考虑以下两种情况:场景1).今天是2012年5月1日,场景2).今天是2012年9月1日.
现在,请考虑我们在我们的网页上写下以下关于某人留下的评论:"此评论写于3个月和12天前".即使声明完全相同,这两种情况下的天数也总是不同.在情景1中,"3个月和12天"将相等102 days
.但是,在场景2中,"3个月和12天"将是104 days
!
现在,谈谈我的观点,让我们使用一个不同的例子,并说有人在2013年1月30日在我们的网站上发表评论,今天是2013年3月10日.我们真实的TimeSpan对象需要知道这个相对日期,并且可以计算出来以下内容:
因此,这意味着10天+ 1天+ 1个月总计,转换为This comment was posted 1 Month and 11 Days ago
.
现在,如果您使用MS样式TimeSpan对象(或任何语言的任何TimeSpan对象),它将为您提供从1月30日到3月10日(39天)的天数,并且因为TimeSpan对象不存储相对日期(我们减去获得TimeSpan的基数/初始日期),如果你问它有多少个月和几天,它会假设一个月内有30天,甚至最差,大于30天的平均值,并在几天内返回其余的,所以要到39天,它会告诉你它是1个月和9天,你会收到This comment was posted 1 Month and 9 Days ago
消息.请记住,这两种情况都具有相同的开始日期和相同的当前/结束日期,是的Microsoft TimeSpan对象,不允许我们告诉它应该考虑2013年2月,给了我们一个完全不同的TimeSpan,关闭整整2天.它实际上对我们撒了谎.
问题是,人们会相信这一点,谁知道他们可能有什么看法,他们对过去的看法如何改变,以及他们在尝试重建过去内部事件时可能做出的决定和生活选择,而从不注意或理解代表时间的缺点和固有的失败,这在当今无处不在.他们不会理解编程语言没有实现(或关心)上个月有31天,反对30,29或28 - 反之亦然,并且当你增加TimeSpan时这会增加.
这是这篇文章的核心问题.我知道大多数人都不会关心这种差异(但要确保我们有些人这样做,并且不能背负这种差异),如果这不打扰你,那没关系.我希望它不会打扰我,我会节省一些时间,压力和失望.如果这不是一个麻烦,您可以使用该功能有效地文本显示相对时间(可定制为从几秒到几年的1到6个节点),而不是使用它提供的通常可忽略的精度.
令我失望的是,我注意到没有真正的时间跨度对象,如果你得到一个时间跨度,做一个.years
或.months
你什么也得不到,你只会得到.days
和降低,因为timeSpan对象没有任何东西告诉它哪个月或者年份是什么时候创建的.因此,它永远不会真正知道自每个月的日子在一年内变化多少个月甚至是闰年的变化.
为此,我将发布一个我开发的函数,以获得准确的读数,并能够在我的ASP.NET网页上返回如下内容......
发表于4年,3个月,14天,15小时,18分钟和24秒之前
我想有一个......
timeSpan.GetActualNumberOf[Months/Days/Hours/etc]
(当然必须提供基准日期)
...此数据类型的类型方法,但没有.
所有你真的需要做的是在时间跨度对象上创建另一个属性给它上计算出的差异,那么上面可爱的字符串将是可计算很容易地和一个基准日.year
及.month
会存在!
更新:我已经大大扩展并更新了我在下面的答案中的官方答案和代码使用细节,100%工作答案和代码(完整),准确和准确的相对时间/日期,没有近似值 - 谢谢.
必须有一个简单的答案:
var totalTime = TimeSpan.Zero;
foreach (var timesheet in timeSheets)
{
//assume "time" is a correct, positive TimeSpan
var time = timesheet.EndTime - timesheet.StartTime;
totalTime.Add(time);
}
Run Code Online (Sandbox Code Playgroud)
列表中只有一个值,timeSheets
它是正值TimeSpan
(在本地检查中验证).
我使用此代码转换Timespan
为String
(例如:14:53):
myTimeSpan.ToString("hh:mm");
Run Code Online (Sandbox Code Playgroud)
但是会发生以下错误:
输入字符串的格式不正确
这样做的正确方法是什么?
我有一个值TimeSpan
,让我们说:tsp1
= 2小时5分钟.我有另一个TimeSpan
变量,其中包含如下值:tsp2
= 0小时2分钟
请告诉我如何划分tsp1
,tsp2
以便我可以获得tsp2
分成的确切次数tsp1
和剩余部分.
我正在使用Visual Studio 2008.
谢谢.
我有一个生成时间跨度的代码来计算某个动作的持续时间.我想要做的是取结果(持续时间)并除以一个数字,任何数字.
我怎样才能做到这一点?