如何在.NET中表示一个仅限于时间的值?

有没有一种方法可以代表只有在.NET的时间价值没有date? 例如,指示一家商店的开放时间?

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

正如其他人所说的,您可以使用DateTime并忽略date,或使用TimeSpan 。 就我个人而言,我不喜欢这些解决scheme,因为这两种types都不能真正反映你想要expression的概念 – 我把.NET中的date/时间types视为稀疏的一面,这是我开始的原因之一野田时间 。 在Noda Time中,您可以使用LocalTimetypes来表示一天的时间。

有一件事要考虑:一天的时间不一定是自同一天午夜以来的时间长度。

(另一方面,如果你也想代表一个商店的closures时间,你可能会发现你想代表24:00,即在一天结束的时间。大多数date/时间的API – 包括野田时间 – 不要让它被表示为时间价值。)

你可以使用时间跨度

 TimeSpan timeSpan = new TimeSpan(2, 14, 18); Console.WriteLine(timeSpan.ToString()); // Displays "02:14:18". 

[编辑]
考虑到其他答案和编辑问题,我仍然会使用TimeSpan。 没有必要创build一个新的结构,只要框架中现有的结构就足够了。
在这些行上,您最终会复制许多本机数据types。

如果这个空的Date真的让你感到困惑,你也可以创build一个更简单的Time结构:

 // 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

我说使用DateTime。 如果你不需要date部分,就忽略它。 如果您只需要显示给用户的时间,输出格式如下所示:

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

似乎所有额外的工作,甚至使用TimeSpan是不必要的。

我认为鲁本斯的class级是一个很好的主意,所以他认为通过基本validation可以为他的时间课程做一个不变的样本。

 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); } } 

除了Chibueze Opata

 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); } public void AddHours(uint h) { this.Hours += (int)h; } public void AddMinutes(uint m) { this.Minutes += (int)m; while(this.Minutes > 59) this.Minutes -= 60; this.AddHours(1); } public void AddSeconds(uint s) { this.Seconds += (int)s; while(this.Seconds > 59) this.Seconds -= 60; this.AddMinutes(1); } } 

如果您不想使用DateTime或TimeSpan,并且只想存储一天中的时间,则可以将自午夜以来的秒数存储在Int32中,或者(如果您甚至不想要秒数)存储自午夜以来的分钟数将适合于Int16。 写出从这个值访问小时,分钟和秒钟所需的几种方法将是微不足道的。

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

(当然,如果你使用类似上面简单的scheme,那么如果你突然意识到会给你一个优势,将来用TimeSpanreplace存储也是微不足道的)