将每日活动时间转换为“周一至周五10:00-10:30AM”格式

时间:2013-04-11 13:56:16

标签: c# algorithm time formatting

我有一张存储日常活动的表格,例如“早上会议”。这些活动在每周的一天或多天中在白天的不同时间进行。我需要一种算法来产生活动时间的“好”描述。目前,我正在使用这种数据结构:

public class DailyActivityTime
{
    public int WeeklyActivityTimeId { get; set; }
    public bool Sunday { get; set; }
    public string SundayStartTime { get; set; }
    public string SundayEndTime { get; set; }
    public bool Monday { get; set; }
    public string MondayStartTime { get; set; }
    public string MondayEndTime { get; set; }
    public bool Tuesday { get; set; }
    public string TuesdayStartTime { get; set; }
    public string TuesdayEndTime { get; set; }
    public bool Wednesday { get; set; }
    public string WednesdayStartTime { get; set; }
    public string WednesdayEndTime { get; set; }
    public bool Thursday { get; set; }
    public string ThursdayStartTime { get; set; }
    public string ThursdayEndTime { get; set; }
    public bool Friday { get; set; }
    public string FridayStartTime { get; set; }
    public string FridayEndTime { get; set; }
    public bool Saturday { get; set; }
    public string SaturdayStartTime { get; set; }
    public string SaturdayEndTime { get; set; }
    public bool Biweekly { get; set; }
    public string DisplayText { get; set; }
}

StartEnd次作为TIME数据类型保存到SQL Server(2008 R2)(因此作为TimeSpan进入C#代码), bool属性当然是BIT。我想在DailyActivityTime类本身的C#中编写转换为描述的代码,无论是在构造函数中还是在DisplayText属性getter中。

因此,举例来说,早晨会议活动如下:

Monday: 10:00-10:30AM  
Tuesday: 10:00-10:30AM  
Wednesday: 10:00-10:30AM  
Thursday: 10:00-10:30AM  
Friday: 10:00-10:30AM  
Saturday: 5:00-6:00PM  
Sunday: 5:00-6:00PM  

我需要将此示例显示为:

Mon-Fri 10:00-10:30 AM, Sat & Sun 5:00-6:00 PM

一些基本事实:

  1. 活动只能在任何一天发生一次。即周日早上会议不会发生两次。
  2. 一周内超过两天的不按顺序发生的活动可以用逗号分隔的列表显示,例如Mon, Wed, Fri 1:00-1:30 PM
  3. 标记为Biweekly的活动将显示为“每隔一个......”,并且每周不会超过一天,例如Every other Thurs 3:00-3:45 PM
  4. 虽然我已经为这个实体创建了表格和相关类,但如果有更好的解决方案,我完全愿意以不同的格式存储这些数据。
  5. 我很确定我可以通过为一周中的每一天分配一个整数序列然后比较时间来解决这个问题,但似乎可能有更好的算法,可能使用TimeSpan结构体。有人有主意吗?

2 个答案:

答案 0 :(得分:2)

Time Period库可以帮助您解决这个问题

答案 1 :(得分:1)

我认为如果您每天维护一个类,在您的类中有一组数组,并使用索引器来访问它们,您会发现您的代码更容易使用:

public class ActivityDay
{
    public bool Active { get; set; }
    public string StartTime { get; set; }
    public string EndTime { get; set; }
}

public class DailyActivityTime
{
    public int WeeklyActivityTimeId { get; set; }
    public bool Biweekly { get; set; }
    public string DisplayText { get; set; }
    private ActivityDay[] _days = new ActivityDay[7];

    public ActivityDay this[int day]
    {
        get { return _days[day]; }
        set { _days[day] = value; }
    }
}

因此Sunday变为foo[0]Mondayfoo[1]等。想想看,您可以使用DayOfWeek enumeration作为索引。< / p>

你可以使ActivityDay成为一个结构,但是你会遇到相当不方便的值语义。