计算未来事件时间的日期时间

时间:2011-09-29 20:19:01

标签: c# datetime

我正在创建一个函数,根据当前时间设置事件的日期。

我列举了一些事件:

public enum EventTimings
{
     Every12Hours,  // 12pm and midnight
     Weekly // sunday at midnight
}


public static DateTime CalculateEventTime(EventTimings eventTime)
{
  DateTime time;

  switch(eventTime)
  {
     case EventTimings.Every12Hours:
        break;

  }

  return time;
}

所以(Every12Hour事件类型)如果当前时间是上午10点,那么eventdate将是同一天但是在中午12点。

我该怎么写呢?

我还必须确保这适用于12月31日以及任何其他奇怪的异常日期/时间。

对于这个场景来说,datetime是最好的吗?

4 个答案:

答案 0 :(得分:2)

如果你想能够测试任何东西,我会让你试图“圆化”显示的DateTime,比如

public static DateTime RoundedDate(DateTime eventTime, EventTimings strategy)
{
   switch (strategy)
      case EventTimings.Weekly :
         return WeeklyRounding(eventTime);
   ... etc ...

通过这种方式,您现在可以为12小时间隔,周间隔编写专门的方法,并在任何输入日期进行测试,而不依赖于您的计算机时钟。

答案 1 :(得分:1)

我同意通过将引用日期设置为输入参数而不是当前日期时间来保持通用性。但是,正如您已经询问了eventTime值的逻辑,我就是这样做的。

我该怎么写呢?

对于每12小时,检查输入日期的小时属性并检查它是否小于12.如果是,则在12pm创建一个新的TimeSpan并将其添加到输入日期的日期部分。 如果没有,请在输入日期添加1天,为12am创建TimeSpan并将其添加到inputdate的datepart。

对于每周(星期一上午12点),检查输入日期的周日,只需添加天数使其等于传入的星期一(这就像(8天一周)一样简单)并将12am TimeSpan添加到日期即将到来的星期一的日期。

   public enum EventTimings
    {
        Every12Hours,  // 12pm and midnight
        Weekly // sunday at midnight
    }


    public static DateTime CalculateEventTime(EventTimings eventTime, DateTime inputDate)
    {
        DateTime time = DateTime.Now;
        switch (eventTime)
        {
            case EventTimings.Every12Hours:
                time = inputDate.Hour > 12 ? inputDate.AddDays(1).Date + new TimeSpan(0, 0, 0) : inputDate.Date + new TimeSpan(12, 0, 0);
                return time;
            case EventTimings.Weekly:
                int dayoftheweek = (int) inputDate.DayOfWeek;
                time = inputDate.AddDays(8 - dayoftheweek).Date + new TimeSpan(0, 0, 0);
                return time;
// other cases

        }

    }

对于这个场景,datetime是最好的吗?

是。使用DateTime和TimeSpan进行日期时间计算应该考虑闰年,夏令时或年终场景。此外,您可以尝试添加SpecifyKind以表示它是本地时间。

答案 2 :(得分:1)

你也可以尝试这样的事情,虽然如果你想每月做一些事情就会崩溃(因为每个月有不同的天数。)此外,虽然这种简化的方法将确保在12点和午夜返回日期,每周偏移量从开始日起每7天一次......不一定在星期日。但是,您可以使用switch语句轻松地容纳该行为。重载方法还允许您灵活地提供自定义偏移量。

另外,要回答你的问题,是的,我会使用System.DateTime和System.TimeSpan。他们负责确定一年或一月是否为您“翻身”。

public enum EventTimings : int
{
    Default = 12,           // Default every 12 hours.
    NoonAndMidnight = 12,   // Every 12 hours.
    Weekly = 168,           // 168 hours in a week.
    ThirtyDays = 720        // 720 hours in 30 days.
}

public DateTime CalculateDateTime(DateTime starting, EventTimings timing)
{
    return CalculateDateTime(starting, TimeSpan.FromHours((int)timing));
}

public DateTime CalculateDateTime(DateTime starting, TimeSpan span)
{
    DateTime baseTime = new DateTime(starting.Year, starting.Month, starting.Day, starting.Hour >= 12 ? 12 : 0, 0, 0);
    return baseTime.Add(span);
}

答案 3 :(得分:0)

我遵循的算法就是这样......

  1. eventTime日中午放入变量
  2. 检查该变量是否在eventTime
  3. 之前
  4. 如果不是,请添加12小时
  5. 返回变量

    switch (strategy)
    {
        case EventTimings.Every12Hours:
        //get noon for the event date
        DateTime x = eventTime.Date.AddHours(12);
    
        //check to see if x is after the eventTime
        if (x < eventTime)
        {
            //if so, advance x by 12 hours to get midnight on the next day
            x = x.AddHours(12);
        }
    
        return x;
    
        break;
    
        //other cases...
    }