问题琢磨了几天,还是不能很好的解决!所以在这里寻求一下帮助!有个程序,里面有个任务!此任务是 每天7:30:00-到次日3:30:30 这个时间段可以执行!例如:今天是2009-11-14,那么任务执行的时间是:2009-11-14 7:30:00 到 2009-11-15 3:30:30 ,      那么下次就是:2009-11-15 7:30:00 到 2009-11-16 3:30:30 ,以此类推,一直按照这个规则运行下去!我自己做的时候是:放了定时器,每秒检测一下,现在时间是不是在某天的开始,和结束时间范围内!如果在就执行!        public void btimeEvent(object source, ElapsedEventArgs e)
        {
            string st1 = e.SignalTime.ToString("HH:mm:ss");//当前时间
            DateTime dt1 = Convert.ToDateTime(st1);
            DateTime odt = Convert.ToDateTime(game.Game_opentime);//游戏开始时间
            DateTime edt = Convert.ToDateTime(game.Game_endtime);//游戏结束时间
            if (DateTime.Compare(dt1, odt) >= 0 && DateTime.Compare(dt1, edt) < 0)
            {
                //运行任务
            }
         }这个时候问题出来了,就是时间没过今日23:59:59秒,是正常的!过了今日,下一日就直接开始时间计算成2009-11-15 7:30:00了!那么中间 2009-11-15 00:00:00 到 2009-11-15 3:30:30 就少了这一部分!问题就是这样!不知道说清楚了没有!

解决方案 »

  1.   

    string st1 = e.SignalTime.ToString("HH:mm:ss");//当前时间
    =========
    注意看这句,说明dt1最后只是个时间,而不带日期的。例如dt1=20:20:20 因为你是夸天比较的,所以这显然不能作为比较的依据。
    正确的做法是带上日期。
    例如:string st1 = e.SignalTime.ToString("yyy-MM-dd HH:mm:ss");//当前时间
    明白了没?
      

  2.   

    string st1 = e.SignalTime.ToString("yyyy-MM-dd HH:mm:ss");
    少写个y
      

  3.   


            /// <summary>
            /// 计算两个日期之间相差的工作日天数
            /// </summary>
            /// <param name="dtStart">开始日期</param>
            /// <param name="dtEnd">结束日期</param>
            /// <returns>Int</returns>
            public int CalculateWorkingDays(DateTime dtStart, DateTime dtEnd)
            {
                int count = 0;
                for (DateTime dtTemp = dtStart; dtTemp < dtEnd; dtTemp = dtTemp.AddDays(1))
                {
                    count++;
                }
                return count;
            }带上日期就好了
      

  4.   

    1楼的,我下面的语句:DateTime dt1 = Convert.ToDateTime(st1);
     能自动带上日期。不会出现你说的问题。问题是怎样实现我这个算法!
      

  5.   

    你测试过了吗?不加日期怎么可能自己给你带上日期?如果Convert.ToDateTime函数自动给你加日期就说明微软出的这个函数有个重大的BUG
    你试一下下面的代码吧。using System;
    using System.Collections.Generic;
    using System.Text;namespace ConsoleApplication3
    {
        class Program
        {
            static void Main(string[] args)
            {
                string st1 = DateTime.Now.ToString("HH:mm:ss");//当前时间
                DateTime dt1 = Convert.ToDateTime(st1);
                Console.WriteLine(st1.ToString());
            }
        }
    }
      

  6.   


                 string st1 = e.SignalTime.ToString("HH:mm:ss");//当前时间
                DateTime dt1 = Convert.ToDateTime(st1);
                DateTime odt = Convert.ToDateTime(game.Game_opentime);//游戏开始时间
                DateTime edt = Convert.ToDateTime(game.Game_endtime);//游戏结束时间
        
                TimeSpan df1 = dt1.Subtract(odt);
               
                if(df1.Day == 0)
                {   
                    if(df1.TotalSeconds >= 0)
                    {
                        //execute
                    }
                 }
                 else if (df1.Days == 1)
                 {
                     TimeSpan df2 = edt.Subtract(dt1);
                     if(df2.TotalSeconds >= 0)
                     {
                         //execute
                     }
                 }
     
      

  7.   

    这个问题逆向思维,就容易解决了。public void btimeEvent(object source, ElapsedEventArgs e)
    {
        string str_start = "07:30:00";  //每天开始时间
        string str_stop = "03:30:30";   //次日结束时间    DateTime No_start = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd ") + dt_start);
        DateTime No_stop = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd ") + dt_stop);    if (!(DateTime.Now >= No_stop && DateTime.Now<=No_start))
        {
            //运行任务
        }
    }
      

  8.   

    也就是说每天的3:30:30到7:30这段时间内是肯定不会执行的,那么你判断一下e.SignalTime是否在这个时间段内不就可以了吗?
      

  9.   

    判断时间差在3:30:30 -7:30:00内不执行
    DateTime dts= Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd ") + "07:30:00");
    DateTime dte= Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd ") + dt_stop);
    if (DateTime.Now.Compare(dts)>=0 &&DateTime.Now.Compare(dte)<=0)
     {
        
       }
      

  10.   


    public void btimeEvent(object source, ElapsedEventArgs e)
    {
        DateTime dt=(DateTime)e.e.SignalTime.ToString("HH:mm:ss")
        DateTime  start = DateTime.Prase("07:30:00");  //每天开始时间
        DateTime  stop =DateTime.Prase("03:30:30");   
        if (dt>stop&&dt<start)
               return;
       //运行任务}
      

  11.   

    public void btimeEvent(object source, ElapsedEventArgs e)
    {
        string start = "07:30:00";                        //每天开始时间
        string stop = "03:30:30";                         //次日结束时间
        string now = DateTime.Now.ToString("HH:mm:ss");   //现在的时间    if (!(now >= stop && now <= start))
        {
            //运行任务
        }
    }
      

  12.   

    你好!5 楼的  Convert.ToDateTime("07:30:00") 确实会自动带上日期的!
      

  13.   

    我想可以这么处理:
    1,假设有一个日期型 全局变量currentDate
    2,用TimeSpan来判断你设定的这个时间范围。
    这样就不存在别的问题了。具体代码你自己捉摸吧!
      

  14.   

    currentDate存放当天的日期值。
      

  15.   

     public void btimeEvent(object source, ElapsedEventArgs e)
            {
                string st1 = e.SignalTime.ToString("HH:mm:ss");//当前时间
                DateTime dt1 = Convert.ToDateTime(st1);
                DateTime odt = Convert.ToDateTime(game.Game_opentime);//游戏开始时间
                DateTime edt = Convert.ToDateTime(game.Game_endtime);//游戏结束时间
                if (DateTime.Compare(dt1, odt) >= 0 && DateTime.Compare(dt1, edt) < 0)
                {
                    //运行任务
                }
             }这里面game.Game_opentime,game.Game_endtime,是开始时间,和结束时间!来自于Game类,我随时都要知道game.Game_opentime,game.Game_endtime 的值!不只是可以运行而已!
      

  16.   


    没那么复杂,给你一段伪代码:
    定义两个时间数据,起始时间 = 7:30:00,结束时间 = 3:30:30
    如果 当前时间 >= 起始时间 或者 当前时间 <= 结束时间
      运行
    否则 休息
    只有起始时间和结束时间有交集,(如结束时间是第二天的 7:30:00 之后),才有必要带上日期。具体时间格式就用8楼的
      

  17.   

    前面所有人都走进了一个误区,这种问题完全不需要看日期,看了日期就把问题复杂化了。其实实现起来代码非常简单,如下:TimeSpan ts = DateTime.Now.TimeOfDay; //当前时间
    TimeSpan ts1 = new TimeSpan(7, 30, 0);//游戏开始时间
    TimeSpan ts2 = new TimeSpan(3, 30, 0);//游戏结束时间if (ts > ts1 || ts < ts2)
    {
        //运行任务}
      

  18.   

    23楼的代码,短小精悍!可以说解决了,我很大的问题。非常感谢!但是有一点点遗憾!我不能,获得某个周期内的,开始时间,和结束时间!就是:比如程序里有个函数!我想随时调用一下,看看现在的开始时间,和结束时间是多少!他应该是类似这样的结果:opentime=2009-11-15 07:30:00 ; endtime=2009-11-16 3:30:30之所以这样用,是为了,给web端调用留个接口!如果只在winform里可以不考虑详细的周期,因为winform里面可以保存临时变量,可是web端调用却是无状态的! 
      

  19.   

    为什么说不能?获取周期内的开始时间和结束时间也是非常容易的啊,例如:
    TimeSpan ts = DateTime.Now.TimeOfDay; //当前时间
    TimeSpan ts1 = new TimeSpan(7, 30, 0);//游戏开始时间
    TimeSpan ts2 = new TimeSpan(3, 30, 0);//游戏结束时间if (ts > ts1 || ts < ts2)
    {
        //运行任务
         //
        DateTime bdate = DateTime.Today + ts1;
        DateTime edate = DateTime.Today.AddDays(1) + ts2;    MessageBox.Show("当前开始时间:" + bdate.ToString() + ";当前结束时间:" + edate.ToString());
    }
      

  20.   

    改动一下,要判断下时间点。
    TimeSpan ts = DateTime.Now.TimeOfDay; //当前时间
    TimeSpan ts1 = new TimeSpan(7, 30, 0);//游戏开始时间
    TimeSpan ts2 = new TimeSpan(3, 30, 0);//游戏结束时间if (ts > ts1 || ts < ts2)
    {
        //运行任务
         //
        DateTime bdate;
        DateTime edate;    if (ts > ts1)
        {
            bdate = DateTime.Today + ts1;
            edate = DateTime.Today.AddDays(1) + ts2;
        }
        else
        {
            bdate = DateTime.Today.AddDays(-1) + ts1;
            edate = DateTime.Today + ts2;
        }    MessageBox.Show("当前开始时间:" + bdate.ToString() + ";当前结束时间:" + edate.ToString());
    }
      

  21.   

            public void btimeEvent(object source, ElapsedEventArgs e)
            {
                DateTime ts = DateTime.Now; //现在时间
                TimeSpan tsspan = DateTime.Now.TimeOfDay; //当前时间
                TimeSpan ts1 = new TimeSpan(7, 30, 0);//游戏开始时间
                TimeSpan ts2 = new TimeSpan(3, 30, 0);//游戏结束时间
                TimeSpan ts3 = new TimeSpan(0, 0, 0);//零点整
                TimeSpan ts4 = new TimeSpan(23, 59, 59);//23.59.59秒
                if (tsspan > ts1 || tsspan < ts2)
                {
                   
                    if (tsspan > ts3 && tsspan < ts2)//如果在0点-3:30:30点这段时间
                    {
                         listBox1.Items.Add("运行1");
                         opentime = GetDate(ts.AddDays(-1)) + " 7:30:00";
                         endtime = GetDate(ts) + " 3:30:00";
                    }
                    if (tsspan > ts1 && tsspan < ts4)//如果在7:30:00点-23:59:59点这段时间
                    {
                         listBox1.Items.Add("运行2");
                         opentime = GetDate(ts) + " 7:30:00";
                         endtime = GetDate(ts.AddDays(1)) + " 3:30:00";
                    }            }
                textBox1.Text = opentime;
                textBox2.Text = endtime;        }根据楼上的,我也改了一下,发现可以实现预定的效果!之前本人有个误区,以为不带日期的时间不可以做比较,原来可以做比较!算法就是利用了这一点,解决了我的困扰!在次感谢各位!
      

  22.   

            /// <summary>
            /// 返回标准时间格式string(包含日期)
            /// </summary>
            public static string GetDate(DateTime t)
            {
                return t.ToString("yyyy-MM-dd");
            }漏个函数