处理负时间跨度
Posted
技术标签:
【中文标题】处理负时间跨度【英文标题】:Handle negative time spans 【发布时间】:2010-11-04 08:31:27 【问题描述】:在我的网格输出中,我计算 TimeSpan
并取其 TotalHours
。例如
(Eval("WorkedHours") - Eval("BadgedHours")).TotalHours
目标是将TotalHours
显示为39:44
,因此我需要将值从7.5
转换为07:30
。这没问题......除非它是负面的!
我可以使用
从Hours
创建一个 TimeSpan
对象
TimeSpan.FromHours( (Eval("WorkedHours") - Eval("BadgedHours")).TotalHours)
如果是负数,我无法将其转换为DateTime
以使用.ToString("HH:mm")
方法,并且TimeSpan
对象不支持格式字符串。
【问题讨论】:
请考虑将代码 sn-ps 重新格式化为内联代码或代码段,并添加适当的平台标签(我猜是您的 sn-ps 中的 .NET)。 【参考方案1】:没有TimeSpan.Duration
方法吗?我认为这可以处理您正在尝试做的事情。
返回一个新的 TimeSpan 对象,其值为当前 TimeSpan 对象的绝对值。
【讨论】:
这是最简单的方法,只需减去您的两个 DateTimes,在结果上调用 Duration(),然后执行 TotalHours。【参考方案2】:TimeSpan Diff = Date1 - Date2;
if ((int)Diff.TotalDays < 0) // your code
【讨论】:
【参考方案3】:我检查了每个地方。但是我没有得到正确的答案,为什么我用这种方式完成
TimeSpan diff = actualout.Subtract(actualin);
string a =(diff.ToString()).ToString();
if(a.Contains("-"))
diff = new TimeSpan(0,0,0,0);
【讨论】:
比较简单的方法是比较if (diff < TimeSpan.Zero)
【参考方案4】:
TimeSpan 类中有一个 Negate 方法。
链接到 MSDN 文档: TimeSpan.Negate Method()
【讨论】:
【参考方案5】:它的工作。试试这个
mytimespam.Negate();
【讨论】:
时间垃圾邮件,呵呵 ;)【参考方案6】:你好,我把这个变成了我一直在写的一些代码,希望对你有帮助
(结果)是一个 int 变量
(TimeSpan.FromMinutes(result)) < TimeSpan.Zero ? "-" + TimeSpan.FromMinutes(result).ToString(@"hh\:mm") : "" + TimeSpan.FromMinutes(result).ToString(@"hh\:mm");
【讨论】:
【参考方案7】:简单的解决方案是:
string format = "HH:mm";
if(hours < 0)
format = "-" + format;
hours = Math.Abs(hours)
【讨论】:
【参考方案8】:static string ToHMString(TimeSpan timespan)
if (timespan.Ticks < 0) return "-" + ToHMString(timespan.Negate());
return timespan.TotalHours.ToString("#0") + ":" + timespan.Minutes.ToString("00");
Console.WriteLine(ToHMString(TimeSpan.FromHours(3))); //Prints "3:00"
Console.WriteLine(ToHMString(TimeSpan.FromHours(-27.75))); //Prints "-28:45"
如果时间跨度超过 24 小时,这也将正常工作。
【讨论】:
【参考方案9】:只需将其乘以 -1 或使用绝对值函数。
【讨论】:
对于任何在谷歌上搜索过的人:使用TimeSpan.Duration
方法。来自 MSDN:“返回一个新的 TimeSpan 对象,其值为当前 TimeSpan 对象的绝对值”。以上是关于处理负时间跨度的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Selenium 中使用 @FindBy 注释来处理跨度文本?