【问题标题】:How to Handle Actual Time with Durations in C#?如何在 C# 中处理带有持续时间的实际时间?
【发布时间】:2010-11-27 08:20:49
【问题描述】:

比较完整的DateTime 实例与代表一天中的实际时间的小时、分钟和秒的首选方法是什么,并且能够对这些三元组进行操作(例如@987654322 @ 小时、分钟、秒..)?


我目前的方法是这样的

DateTime startHour = new DateTime(1900,1,1,12,25,43);
DateTime endHour = new DateTime(1900,1,1,13,45,32);

// I need to, say, know if a complete DateTime instance 
// is later than startHour plus 15 minutes

DateTime now = DateTime.Now();

startHour = startHour.addMinutes(15);

if (now.CompareTo(new DateTime(now.Year, now.Month, now.Day, startHour.Hour, 
                    startHour.Minute, startHour.Second)) > 0) 
{
    //I can do something now
}

这非常麻烦,甚至容易失败。在我看来,TimeSpans 不是解决方案,因为它们代表跨度并且不受 24 小时限制的约束(TimeSpan 56 小时 34 分钟有效。)

此类计算的首选方法是什么?

【问题讨论】:

  • 您要解决什么问题?仅仅是TimeSpan可以超过24小时吗?因为您可以轻松检查。

标签: c# .net datetime time date-math


【解决方案1】:

完全不清楚“大于 startHour”是什么意思......但是采取

TimeSpan startHour = new TimeSpan(12, 25, 43);
if (endHour.TimeOfDay > startHour)
{
    ...
}

... 工作非常简单。

一定要添加参数检查,以确保您没有为 startHour 指定值 < 0 或 > 23 小时,但这一切都很容易。

与 Joda Time 相比,.NET 的日期和时间 API 非常原始(即使在 3.5 中也是如此)——但在这种特殊情况下,我认为它还不错。

【讨论】:

  • 这是我第一次听到有人用否定的语气将 .NET 日期/时间 API 称为“原始”,我完全不同意。 :)
  • @280Z284:在 3.5 之前,您甚至不能使用非本地时区!与 Joda 相比,.NET 确实很原始。没有代表具有关联时区的瞬间的类型 - 只是一个 UTC 偏移量。布莱赫。如果我有更多时间,会考虑移植 Joda。
  • 是的,乔达摇滚。尤其是与原生 Java 日期时间相比。
  • 是否有任何 .NET 库可以提供帮助?
  • 或者,也许是 Joda Time 的 .NET 转换?
【解决方案2】:

一点提示 - .NET 支持对 DateTime 对象的算术运算,并返回一个 TimeSpan 对象。因此,您可以执行以下操作:

DateTime fromDate = ....
DateTime toDate = ....
TimeSpan diff = toDate - fromDate;

您可以将其扩展为:

DateTime fromDate = DateTime.Now;
DateTime toDate = DateTime.Now.addMinutes(x);

if ((toDate - fromDate).TotalMinutes > 15) {
    ...
}

【讨论】:

    【解决方案3】:

    所以你只对日期的时间部分感兴趣。

    if(DateTime.Now.TimeOfDay > startHour.TimeOfDay)
    {
      // do stuff
    }
    

    这样做有什么问题?

    【讨论】:

    • 它可以工作,但不需要 startHour 和 endHour 的 Date 部分。
    • 是的,但前提是您假设提供的 sn-p 是使用 startHour 的代码的唯一部分。但是如果 startHour 的日期值在其他地方使用呢?
    【解决方案4】:

    您应该对 startHour 和 endHour 使用 TimeSpan。 与现在比较时,您应该将它们“转换”为完整的 DateTime 或使用 Jon Skeet 提到的 DateTime.TimeOfDay 获取时间。

    
    TimeSpan startHour = new TimeSpan(12, 25, 43);
    DateTime now = DateTime.Now;
    
    if (now.CompareTo(DateTime.Today.Add(startHour)) > 0) {
        //...
    }
    

    
    TimeSpan startHour = new TimeSpan(12, 25, 43);
    DateTime now = DateTime.Now;
    
    if (now.TimeOfDay.CompareTo(startHour) > 0) {
        //...
    }
    

    【讨论】:

    • 为什么这样做而不是使用当前时间?为什么要使用 CompareTo 而不是容易重载的“大于”运算符?
    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多