问题描述
我也不知道怎么描述有个任务每5分钟循环我要根据当前时间取得上个时间点(秒不要)比如固定分钟都是0106当前时间=取得的时间12:30:02=12:26:0012:31:00=12:31:0012:33:09=12:31:0012:37:12=12:36:00
解决方案
解决方案二:
什么东西
解决方案三:
什么鬼……没懂
解决方案四:
dt.Minute/5*5+1
解决方案五:
DateTime.Now.AddMinutes(-4)
解决方案六:
接上再修正其它部分假设上面上面结果是dt那么dt.Date.AddHours(dt.Hours).AddMinutes(dt.Minutes)最后你的例子没看懂,为啥33得到的数据是31
解决方案七:
没看懂,是5分钟执行一次循环,还是一个循环控制在5分钟内
解决方案八:
引用5楼starfd的回复:
接上再修正其它部分假设上面上面结果是dt那么dt.Date.AddHours(dt.Hours).AddMinutes(dt.Minutes)最后你的例子没看懂,为啥33得到的数据是31
不好意思我没描述清楚这样我以彩票开奖做个例子彩票开奖每5分钟开一次固定是逢1逢6开那么我就要实时取到上一期的开奖时间比如第1期开奖时间12:0112:0612:1112:1612:21......那现在当前时间是12:33那么就要知道上一期是12:31开的当前时间是12:27那上期就是12:26不知道这样大家能明白了吗
解决方案九:
上N期的开奖时间t=DateTime.Now.AddMinutes(-5*N);引用7楼baidu_33198489的回复:
比如那现在当前时间是12:33那么就要知道上一期是12:31开的当前时间是12:27那上期就是12:26不知道这样大家能明白了吗
没看懂啊
解决方案十:
//date1是当前时间//date2就是最接近的1分或6分的时间DateTimedate2=newDateTime((date1.Ticks-600000000L)/3000000000L*3000000000L+600000000L);
解决方案十一:
引用3楼caozhy的回复:
dt.Minute/5*5+1
呵呵
解决方案十二:
引用3楼caozhy的回复:
dt.Minute/5*5+1
这个就能实现你的目的了
解决方案十三:
引用11楼wow818wow的回复:
Quote: 引用3楼caozhy的回复:
dt.Minute/5*5+1这个就能实现你的目的了
算了下,好像不对。(dt.Minute-1)/5*5+1
解决方案十四:
我看懂了,楼主的意思,我来表述一下:当前时间=取得的时间12:30:02=12:26:0012:31:00=12:31:0012:33:09=12:31:0012:37:12=12:36:00
假定第一行成立,那么1.在12:26分的时候做过一次执行;2.那么下一次的执行时间应该是12:31,所以当前时间正好与上一次应该执行的时间相吻合(因为当前时间可能有秒数,所以12:31就是相对当前时间的上一次执行时间),所以这个时候,返回当前时间3.再下一次的执行时间是31+5,即12:36,12:33还没到36分,所以返回依旧是上次执行时间12:314.同理,12:37的上一次执行时间就是12:36
解决方案十五:
要么就想办法拼结果,取出当前的时、分,判断分的最后一位,如果是1~5,则是1,6~9,则是6,如果是0,则减4分钟。
解决方案:
这道题实际上,分两部分,一部分是对于小时数的叠加,一部分是总的分钟数去掉小时数(mod60)之后的叠加。对于第一部分,我们只需要知道两个datetime相减之后的timespan,就能知道总共间隔了多少个hours,mod60以后,我们便能知道剩下的不足一小时的分钟数,在这不足一小时的分钟数里面,只要加上5的倍数的分钟数即可,比如36分钟,那么我们只要加上35分钟即可。最后,把second清零就OK了。publicstaticDateTimeGetLastExecTime(DateTimefirstExecTime,DateTimecurrentTime){vartimespan=currentTime-firstExecTime;varhours=(int)timespan.TotalHours;varminutes=((int)timespan.TotalMinutes-hours*60)/5*5;returnfirstExecTime.AddHours(hours).AddMinutes(minutes).AddSeconds(-1*firstExecTime.Second);}
解决方案:
开奖是个真实的事件,并且需要长期保存中奖号码及相关信息,用于兑奖和查询所以上一次开奖时间不是计算得到的,而是查表得到的。因为他曾真实的发生过而下一次开奖时间是可以计算预计值的
解决方案:
可以这样查询你要的时间publicstaticDateTimeCalc(int[]minutes){vardt=DateTime.Parse(DateTime.Now.ToString("yyyy-MM-ddHH:mm"));while(!minutes.Contains(dt.Minute))dt=dt.AddMinutes(-1);returndt;}
例如vardatetime=Calc(newint[]{1,6,11,16,21,26,31,36,41,46,51,56});
解决方案:
引用14楼zbdzjx的回复:
要么就想办法拼结果,取出当前的时、分,判断分的最后一位,如果是1~5,则是1,6~9,则是6,如果是0,则减4分钟。
如果是10呢?
解决方案:
你也可以扩展一下第二个参数,让它能够计算其它的起始时间publicstaticDateTimeCalc(int[]minutes,DateTime?startTime=null){if(!startTime.HasValue)startTime=DateTime.Now;vardt=DateTime.Parse(startTime.Value.ToString("yyyy-MM-ddHH:mm"));while(!minutes.Contains(dt.Minute))dt=dt.AddMinutes(-1);returndt;}
解决方案:
判断分钟最后一个数,如果小于6,则等于1,否则,等于6
解决方案:
引用20楼ligyu110的回复:
判断分钟最后一个数,如果小于6,则等于1,否则,等于6
那要是59,等于几?
解决方案:
TimeSpantaskInterval=TimeSpan.FromMinutes(5);//每5分钟一个任务DateTimetaskOrigion=DateTime.Today.AddMinutes(1);//设当天半夜00:01执行第一个任务DateTimenow=DateTime.Now;//当前时间//上一次任务的时间DateTimelastTaskAt=taskOrigion+TimeSpan.FromMinutes(Math.Floor((now-taskOrigion).TotalMinutes/taskInterval.TotalMinutes)*taskInterval.TotalMinutes);
注意:代码未经测试。
解决方案:
其实楼主的问题不过是以5分钟(其实可以为任意值)为一个单位,度量当前时间(相对于一个指定起始点),并取整,而已。
解决方案:
引用18楼sp1234的回复:
Quote: 引用14楼zbdzjx的回复:
要么就想办法拼结果,取出当前的时、分,判断分的最后一位,如果是1~5,则是1,6~9,则是6,如果是0,则减4分钟。如果是10呢?
有说:如果是0,则减4分钟。因为可能会存在跨小时、跨天的可能。
解决方案:
//dtNow:现在时间dt:任意一次执行时间interval:执行间隔//返回上次执行时间publicDateTimeGetTime(DateTimedtNow,DateTimedt,intinterval){intx=dtNow.Minute%interval;inty=dt.Minute%interval;DateTimedtResult;if(x==y){dtResult=dtNow;}elseif(x>y){dtResult=dtNow.AddMinutes(y-x);}else{dtResult=dtNow.AddMinutes(x-interval+y));}returnDateTime.Parse(dtResult.Hour.ToString()+":"+dtResult.Minute.ToString()+":00");}
解决方案:
可以直接返回returndtResult.AddSeconds(-dtResult.Second);这样跨天就没问题了。引用25楼BitCoffee的回复:
//dtNow:现在时间dt:任意一次执行时间interval:执行间隔//返回上次执行时间publicDateTimeGetTime(DateTimedtNow,DateTimedt,intinterval){intx=dtNow.Minute%interval;inty=dt.Minute%interval;DateTimedtResult;if(x==y){dtResult=dtNow;}elseif(x>y){dtResult=dtNow.AddMinutes(y-x);}else{dtResult=dtNow.AddMinutes(x-interval+y));}returnDateTime.Parse(dtResult.Hour.ToString()+":"+dtResult.Minute.ToString()+":00");}
解决方案:
参数任意一次执行时间只需要分钟数即可,不需要完整的时间。
解决方案:
引用25楼BitCoffee的回复:
//dtNow:现在时间dt:任意一次执行时间interval:执行间隔//返回上次执行时间publicDateTimeGetTime(DateTimedtNow,DateTimedt,intinterval){intx=dtNow.Minute%interval;inty=dt.Minute%interval;DateTimedtResult;if(x==y){dtResult=dtNow;}elseif(x>y){dtResult=dtNow.AddMinutes(y-x);}else{dtResult=dtNow.AddMinutes(x-interval+y));}returnDateTime.Parse(dtResult.Hour.ToString()+":"+dtResult.Minute.ToString()+":00");}
这个好。
解决方案:
publicstaticvoidMain(string[]args){//分钟显示情况intminVal=1;intmaxVal=6;DateTimedt=DateTime.Parse("2016-01-1514:03");intmins=dt.Minute%10;if(mins>=maxVal){dt=dt.AddMinutes(-(mins-maxVal));}elseif(mins==0){//0特殊处理。小时或日期可能改变。dt=dt.AddMinutes(10-maxVal);}else{dt=dt.AddMinutes(-(mins-minVal));}Console.ReadLine();}
解决方案:
dt=dt.AddMinutes(10-maxVal);写错了是dt=dt.AddMinutes(-(10-maxVal));
解决方案:
[1,6)1[6,11)6将区间-1[0,5)0[5,10)5((minute-1)/10*10)+(minute-1)%10>5?6:1