是否有一种方法可以在。net中表示一个只有时间而没有日期的值?例如,指示商店的开门时间?

TimeSpan表示一个范围,而我只想存储一个时间值。使用DateTime来表示这将导致新的DateTime(1,1,1,8,30,0),这实际上是不可取的。


当前回答

如果您不想使用DateTime或TimeSpan,而只想存储一天中的时间,则可以将午夜以来的秒存储在Int32中,或者(如果您甚至不需要秒)将午夜以来的分钟存储在Int16中。编写从这样的值访问Hour、Minute和Second所需的几个方法是很简单的。

我能想到的避免使用DateTime/TimeSpan的唯一原因是结构的大小很关键。

(当然,如果你使用一个简单的方案,就像上面包装在一个类中,那么它也将是微不足道的存储替换为TimeSpan,如果你突然意识到这将给你一个优势)

其他回答

我认为Rubens的类是一个好主意,所以我想用基本的验证来做一个不可变的Time类样本。

class Time
{
    public int Hours   { get; private set; }
    public int Minutes { get; private set; }
    public int Seconds { get; private set; }

    public Time(uint h, uint m, uint s)
    {
        if(h > 23 || m > 59 || s > 59)
        {
            throw new ArgumentException("Invalid time specified");
        }
        Hours = (int)h; Minutes = (int)m; Seconds = (int)s;
    }

    public Time(DateTime dt)
    {
        Hours = dt.Hour;
        Minutes = dt.Minute;
        Seconds = dt.Second;
    }

    public override string ToString()
    {  
        return String.Format(
            "{0:00}:{1:00}:{2:00}",
            this.Hours, this.Minutes, this.Seconds);
    }
}

如果您不想使用DateTime或TimeSpan,而只想存储一天中的时间,则可以将午夜以来的秒存储在Int32中,或者(如果您甚至不需要秒)将午夜以来的分钟存储在Int16中。编写从这样的值访问Hour、Minute和Second所需的几个方法是很简单的。

我能想到的避免使用DateTime/TimeSpan的唯一原因是结构的大小很关键。

(当然,如果你使用一个简单的方案,就像上面包装在一个类中,那么它也将是微不足道的存储替换为TimeSpan,如果你突然意识到这将给你一个优势)

正如其他人所说,您可以使用DateTime而忽略日期,或者使用TimeSpan。就我个人而言,我对这两种解决方案都不感兴趣,因为这两种类型都没有真正反映你试图表示的概念——我认为。net中的日期/时间类型有点稀疏,这也是我开始Noda time的原因之一。在Noda Time中,您可以使用LocalTime类型来表示一天中的时间。

请注意,在。net 6中,有TimeOnly和DateOnly类型,它们大致相当于Noda Time的LocalTime和LocalDate类型。

需要考虑的一件事是:一天的时间并不一定是从同一天午夜开始的时间长度……

(另一方面,如果您还想表示商店的关门时间,您可能会发现您想要表示24:00,即一天结束的时间。大多数日期/时间api(包括Noda time)不允许将其表示为一天中的时间值。)

我建议使用DateTime。如果你不需要日期部分,就忽略它。如果你只需要把时间显示给用户,可以这样格式化输出给用户:

DateTime.Now.ToString("t");  // outputs 10:00 PM

似乎所有创建新类或甚至使用TimeSpan的额外工作都是不必要的。

如果空日期真的让你很烦,你也可以创建一个更简单的时间结构:

// more work is required to make this even close to production ready
class Time
{
    // TODO: don't forget to add validation
    public int Hours   { get; set; }
    public int Minutes { get; set; }
    public int Seconds { get; set; }

    public override string ToString()
    {  
        return String.Format(
            "{0:00}:{1:00}:{2:00}",
            this.Hours, this.Minutes, this.Seconds);
    }
}

或者,为什么要麻烦:如果您不需要对该信息进行任何计算,只需将其存储为String。