【问题标题】:How to get datetime difference in double value using Timespan?如何使用时间跨度获取双精度值的日期时间差?
【发布时间】:2015-06-03 05:46:31
【问题描述】:

我想将 sqlserver 数据库中的DateTime 差异保存为double 值 但使用Timespan 我只得到一个小时。我想得到 hh.mm 格式。

我的代码如下:

DateTime starttime = Convert.ToDateTime(date1);
DateTime endtime = Convert.ToDateTime(date2);
TimeSpan span = endtime.Subtract(starttime);
double timedeff=span.Hours;
//Here I getting only hour.I want to this in 'hh.mm' format(double)

【问题讨论】:

  • hh.mm 不是double 格式。它是一个格式化的TimeSpan。你能举出starttime和endtime的例子吗?
  • 这怎么可能与@ckruczek有关?
  • @Rohit:我以为这个问题来了。我只是在想他需要的差异。而且我认为,unix 时间戳差异比浮点数更准确。
  • 我不认为你可以这样判断,不知道 OPs 场景背后的确切要求或原因。 @ckruczek OP 也没有理由使用 UNIX 时间戳差异而不是 DateTime 差异。

标签: c# asp.net datetime-format data-conversion


【解决方案1】:

我假设您希望它采用浮点格式,例如xx.yy 其中 yy = 0..60 对吗?所以你得到 10.02 这意味着 10:02。

解决方法很简单:

DateTime starttime = Convert.ToDateTime(date1);
TimeSpan diff = Convert.ToDateTime(date2).Subtract(starttime);

double timedef = diff.Hours + diff.Minutes / 100.0;

否则会这样

double timedef = diff.Hours + diff.Minutes / 60.0;

我想如果你做这样的事情它会有一些用处:

var str = timedef.ToString("0.00"); 

...但是有更好的方法可以做到这一点。 TimeSpan 和 DateTime 有很多魔力,如果你真的不需要double,请坚持到最后。

关于不动点的说明

DateTime 使用整数进行数学运算。 Double 使用浮点数。根据定义,浮点运算会引入错误;因此使用整数算术可能更好(也更安全)。

DateTime 和 Timespan 正好为日期和增量时间操作提供了这一点。

【讨论】:

    【解决方案2】:

    假设您希望以小时为单位,将分钟和秒也转换为小时。

    double timediff=span.Hours + span.Minutes/60.0 + span.Seconds/(60.0*60.0);
    

    【讨论】:

    • 为什么不直接做 span.TotalSeconds() * 3600 呢?然后你也得到millis等? PS:你的(整数)除法也有错误
    • @atlaste:对不起,除法错误。谢谢。也感谢TotalSeconds():我不知道。
    【解决方案3】:

    我不太清楚你的意思是什么

    'hh.mm' 格式(双精度)

    假设它是这样的:

    9 小时 10 分钟 = 9.10

       DateTime starttime = Convert.ToDateTime(date1);
       DateTime endtime = Convert.ToDateTime(date2);
       TimeSpan span = endtime.Subtract(starttime);
       var datetime = new DateTime(span.Ticks).ToString("H:mm");
       string datetimestring = datetime.ToString().Replace(":",".");
       double timeinDouble =  double.Parse(datetimestring, CultureInfo.InvariantCulture);
    

    如果您想测试不同的场景,这里有一个示例项目 - LINK

    注意:

    1. 确保使用“H”而不是“h”作为格式说明符,否则小时值 0 可能会打印为“12”。

    2. 如果经过的时间是例如26 小时,打印为“02:00”小时。

    3. 如果时间跨度为负数,此方法将导致问题。

    【讨论】:

    • 不正确;不同的语言环境给出不同的结果。
    • @atlaste - 请展开?
    • double.Parse("12.12") -- 在荷兰这是 1212,在英国是 12.12。分隔符标记是本地化/文化信息的一部分;因此,您不应该将它用于文字表示或手动修复它(例如,使用显式 CultureInfo)。一旦你这样做了,你的实现将是正确的——但在性能方面也很糟糕。
    • 一个非常有效的观点。我正在考虑与时间相关的本地化问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多