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

C# 计算未来事件计时的日期时间,c#,datetime,C#,Datetime,我正在创建一个函数,该函数将根据当前时间设置事件的日期 我列举了一些事件: public enum EventTimings { Every12Hours, // 12pm and midnight Weekly // sunday at midnight } public static DateTime CalculateEventTime(EventTimings eventTime) { DateTime time; switch(eventTime)

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

我列举了一些事件:

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;
}
因此(每12小时事件类型)如果当前时间是上午10点,那么事件日期将是同一天,但在下午12点

我该怎么写

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


datetime最适合这个场景吗?

如果你想测试任何东西,我会让你尝试“取整”的datetime显式,比如

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

通过这种方式,您现在可以为12小时间隔(即周间隔)编写一个专门的方法,并在不依赖计算机时钟的情况下,对任何可能的输入日期进行测试

如果你想测试任何东西,我会让你尝试“取整”的日期时间显式,比如

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

通过这种方式,您现在可以为12小时间隔(即周间隔)编写一个专门的方法,并在不依赖计算机时钟的情况下,对任何可能的输入日期进行测试

我要遵循的算法是这样的

  • eventTime
    当天的中午放入一个变量中
  • 检查该变量是否在
    eventTime
  • 如果不是,那么再加上12小时
  • 返回变量

    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...
    }
    
    开关(策略)
    {
    案例事件时间。每12小时:
    //获取活动日期的中午时间
    DateTime x=eventTime.Date.AddHours(12);
    //检查x是否在eventTime之后
    if(x

  • 我遵循的算法是这样的

  • eventTime
    当天的中午放入一个变量中
  • 检查该变量是否在
    eventTime
  • 如果不是,那么再加上12小时
  • 返回变量

    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...
    }
    
    开关(策略)
    {
    案例事件时间。每12小时:
    //获取活动日期的中午时间
    DateTime x=eventTime.Date.AddHours(12);
    //检查x是否在eventTime之后
    if(x

  • 我同意通过将参考日期作为输入参数而不是当前日期时间来保持通用性。然而,正如您所问的事件时间值的逻辑一样,这就是我将要做的

    我该怎么写? 对于每12小时,检查输入日期的hour属性,并检查其是否小于12。如果是这样,那么为12pm创建一个新的时间跨度,并将其添加到输入日期的日期部分。 如果不是,则在输入日期后添加1天,创建一个12 AM的时间跨度,并将其添加到inputdate的日期部分

    对于每周(星期一上午12点),检查inputdate的星期几,只需添加天数,使其等于即将到来的星期一(与(8-DayOfWeek)一样简单),并在即将到来的星期一的日期上添加上午12点的时间跨度

       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进行的datetime计算应考虑闰年、夏令时或endofyear场景。此外,您可以尝试添加SpecifyKind来表示它是本地时间。

    我同意通过将参考日期作为输入参数而不是当前日期时间来保持它的通用性。然而,正如您所问的事件时间值的逻辑一样,这就是我将要做的

    我该怎么写? 对于每12小时,检查输入日期的hour属性,并检查其是否小于12。如果是这样,那么为12pm创建一个新的时间跨度,并将其添加到输入日期的日期部分。 如果不是,则在输入日期后添加1天,创建一个12 AM的时间跨度,并将其添加到inputdate的日期部分

    对于每周(星期一上午12点),检查inputdate的星期几,只需添加天数,使其等于即将到来的星期一(与(8-DayOfWeek)一样简单),并在即将到来的星期一的日期上添加上午12点的时间跨度

       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进行的datetime计算应考虑闰年、夏令时或endofyear场景。此外,您可以尝试添加SpecifyKind来表示它是本地时间。

    您也可以尝试类似的方法,尽管如果您想每月做一些事情,它会崩溃(因为每个月有不同的天数)。此外,虽然此简化方法将确保返回的日期为12和午夜,每周补偿将从开始日起每7天进行一次。。。星期天不一定。不过,您可以使用switch语句轻松地适应这种行为。重载方法还允许您灵活地提供自定义偏移量

    另外,为了回答您的问题,我会使用System.DateTime和System.TimeSpan。他们负责决定一年或一个月是否已经为你“滚动”


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

    另外,为了回答您的问题,我会使用System.DateTime和System.TimeSpan。他们负责决定一年或一个月是否已经为你“滚动”