是否有一种方法可以在。net中表示一个只有时间而没有日期的值?例如,指示商店的开门时间?
TimeSpan表示一个范围,而我只想存储一个时间值。使用DateTime来表示这将导致新的DateTime(1,1,1,8,30,0),这实际上是不可取的。
是否有一种方法可以在。net中表示一个只有时间而没有日期的值?例如,指示商店的开门时间?
TimeSpan表示一个范围,而我只想存储一个时间值。使用DateTime来表示这将导致新的DateTime(1,1,1,8,30,0),这实际上是不可取的。
当前回答
我认为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);
}
}
其他回答
我认为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。如果你不需要日期部分,就忽略它。如果你只需要把时间显示给用户,可以这样格式化输出给用户:
DateTime.Now.ToString("t"); // outputs 10:00 PM
似乎所有创建新类或甚至使用TimeSpan的额外工作都是不必要的。
您可以简单地使用验证约束。
[DataType(DataType.Time)]
public DateTime OpeningTime { get; set; }
如果您不想使用DateTime或TimeSpan,而只想存储一天中的时间,则可以将午夜以来的秒存储在Int32中,或者(如果您甚至不需要秒)将午夜以来的分钟存储在Int16中。编写从这样的值访问Hour、Minute和Second所需的几个方法是很简单的。
我能想到的避免使用DateTime/TimeSpan的唯一原因是结构的大小很关键。
(当然,如果你使用一个简单的方案,就像上面包装在一个类中,那么它也将是微不足道的存储替换为TimeSpan,如果你突然意识到这将给你一个优势)
在c# 10中,你可以使用TimeOnly。
TimeOnly date = TimeOnly.FromDateTime(DateTime.Now);