是否有一种方法可以在。net中表示一个只有时间而没有日期的值?例如,指示商店的开门时间?
TimeSpan表示一个范围,而我只想存储一个时间值。使用DateTime来表示这将导致新的DateTime(1,1,1,8,30,0),这实际上是不可取的。
是否有一种方法可以在。net中表示一个只有时间而没有日期的值?例如,指示商店的开门时间?
TimeSpan表示一个范围,而我只想存储一个时间值。使用DateTime来表示这将导致新的DateTime(1,1,1,8,30,0),这实际上是不可取的。
当前回答
一个系统。TimeOfDay类型最近被批准用于即将发布的。net 6。
参见https://github.com/dotnet/runtime/issues/49036
完成后,这将是表示不与任何特定日期或时区相关联的时间值的首选方式。
系统。TimeSpan仍将是表示经过时间值的推荐方法。
其他回答
你可以使用时间跨度
TimeSpan timeSpan = new TimeSpan(2, 14, 18);
Console.WriteLine(timeSpan.ToString()); // Displays "02:14:18".
(编辑) 考虑到其他答案和问题的编辑,我仍然会使用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。
您可以简单地使用验证约束。
[DataType(DataType.Time)]
public DateTime OpeningTime { get; set; }
我认为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);
}
}
在c# 10中,你可以使用TimeOnly。
TimeOnly date = TimeOnly.FromDateTime(DateTime.Now);