我想写一些接受当前时间的字典 并返回用户定义的时间段。作为time-preiod,我指的是从文件中读取的用户定义的时间段名称。例如
8:00-9:00 - 早餐时间 9:00-12:00 - 工作时间 12:00-13:00 - 午餐时间
等...
目前我的函数基于if-else if语句
// C# syntax omitted for simplicity
TimePeriod GetCurrentTimePeriod(DateTime t)
{
if(t < 8.00)
{
return TimePeriod.Sleep;
}
else if(t < 9.00)
{
...
}
}
我对这个直接的解决方案不满意。我更喜欢用一些 而不是“字典”。
PS。将TimeZone一词更改为TimePeriod以避免与System.TimeZone类混淆。
答案 0 :(得分:3)
如果你需要动态调整那些“时间段”,我建议建立一个包含开始时间,结束时间和描述的记录的简单列表,并简单地用LINQ查询该列表。由于该列表中的项目数量可能非常小,因此线性搜索可以完成这项工作,使用二进制搜索或更高级的数据结构(如段树)是不值得的:
class PeriodOfTime {
public DateTime StartTime {get; set;}
public DateTime EndTime {get; set;}
public string Description {get; set;} // Use your own enum instead
}
// ...
List<PeriodOfTime> periods = new List<PeriodOfTime>();
var timeToQuery = DateTime.Now.TimeOfDay;
var period = periods.FirstOrDefault(p => timeToQuery >= p.StartTime &&
timeToQuery <= p.EndTime);
答案 1 :(得分:3)
几天前就提出了这个问题。有关如何继续的一些想法,请参阅此处的答案。
答案 2 :(得分:1)
对我来说似乎是一个很好的解决方案。或者,您可以设计自己的基于范围的地图。
答案 3 :(得分:1)
您不必使用TimeZone类,因为您将在特定时区获得不同的时间。
您可以使用此课程进行时间转换,例如
TimeZone localZone = TimeZone.CurrentTimeZone;
DateTime baseUTC = new DateTime(2010, 1, 1);
DateTime localTime = localZone.ToLocalTime(baseUTC);
TimeSpan localOffset = localZone.GetUtcOffset(localTime);
您可以使用简单的检查作为问题的答案:
if (youTime >= 8.00 && youTime <= 9.00)
return YourTypes.Breakfast;
else if (youTime > 9.00 && youTime <= 12.00)
return YourTypes.WorkTime;
else
// etc.