问题琢磨了几天,还是不能很好的解决!所以在这里寻求一下帮助!有个程序,里面有个任务!此任务是 每天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 就少了这一部分!问题就是这样!不知道说清楚了没有!
{
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 就少了这一部分!问题就是这样!不知道说清楚了没有!
=========
注意看这句,说明dt1最后只是个时间,而不带日期的。例如dt1=20:20:20 因为你是夸天比较的,所以这显然不能作为比较的依据。
正确的做法是带上日期。
例如:string st1 = e.SignalTime.ToString("yyy-MM-dd HH:mm:ss");//当前时间
明白了没?
少写个y
/// <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;
}带上日期就好了
能自动带上日期。不会出现你说的问题。问题是怎样实现我这个算法!
你试一下下面的代码吧。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());
}
}
}
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
}
}
{
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))
{
//运行任务
}
}
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)
{
}
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;
//运行任务}
{
string start = "07:30:00"; //每天开始时间
string stop = "03:30:30"; //次日结束时间
string now = DateTime.Now.ToString("HH:mm:ss"); //现在的时间 if (!(now >= stop && now <= start))
{
//运行任务
}
}
1,假设有一个日期型 全局变量currentDate
2,用TimeSpan来判断你设定的这个时间范围。
这样就不存在别的问题了。具体代码你自己捉摸吧!
{
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 的值!不只是可以运行而已!
没那么复杂,给你一段伪代码:
定义两个时间数据,起始时间 = 7:30:00,结束时间 = 3:30:30
如果 当前时间 >= 起始时间 或者 当前时间 <= 结束时间
运行
否则 休息
只有起始时间和结束时间有交集,(如结束时间是第二天的 7:30:00 之后),才有必要带上日期。具体时间格式就用8楼的
TimeSpan ts1 = new TimeSpan(7, 30, 0);//游戏开始时间
TimeSpan ts2 = new TimeSpan(3, 30, 0);//游戏结束时间if (ts > ts1 || ts < ts2)
{
//运行任务}
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());
}
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());
}
{
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; }根据楼上的,我也改了一下,发现可以实现预定的效果!之前本人有个误区,以为不带日期的时间不可以做比较,原来可以做比较!算法就是利用了这一点,解决了我的困扰!在次感谢各位!
/// 返回标准时间格式string(包含日期)
/// </summary>
public static string GetDate(DateTime t)
{
return t.ToString("yyyy-MM-dd");
}漏个函数