精华内容
下载资源
问答
  • Crontab实现从指定时间开始每隔多少秒分钟/)执行次脚本的方法背景Crontab的格式Crontab的使用与局限性合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入段漂亮的代码片生成个...

    Crontab实现从指定时间开始每隔多少秒(分钟/天)执行一次脚本的方法

    背景

    大家好,最近发生了很多事,已经很久没有在CSDN上推出新文章了。总之呢,我现在是一名大数据开发工程师,会从今天开始不定期地分享自己学到的新技术。如果你对大数据感兴趣的话,欢迎关注我。
    最近接到了上级分配的一个任务,希望我编写一个linux的定时任务脚本,能够实现从当前时间开始每隔多少天执行一次脚本。这篇文章的故事就这么开始了~

    Crontab的格式

    基于这个问题,我开始百度查询关于crontab的知识,我重点讲讲我发现的crontab的局限性,在阐述我的发现之前,先让我们学习一下crontab的格式:

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # |  |  |  |  |
    # *  *  *  *  * user-name command to be executed
    
    1. minute: 区间为 0 – 59
    2. hour: 区间为0 – 23
    3. day-of-month: 区间为0 – 31
    4. month: 区间为1 – 12. 1 是1月. 12是12月.
    5. Day-of-week: 区间为0 – 7. 周日可以是0或7.

    Crontab可以说是一款非常优秀的定时启动任务工具,可以让我们指定每隔多少分钟、多少小时、多少天、几个月或者每个星期的星期几来执行任务。

    Crontab的使用与局限性

    再优秀的工具都有其局限性,在我使用Crontab的过程当中,我发现在指定不同的时间间隔时,Crontab都有其局限性:

    1. minute: 只可以以一个小时为范围来指定间隔多少分钟。
    2. hour: 只可以以一天为范围来指定间隔多少小时。
    3. day-of-month: 只可以以一个月为范围指定间隔多少天。
    4. month: 只可以以一年为范围指定间隔几个月。

    我上面的阐述可能不太易于理解,没关系,让我们结合具体实例来讲解:

    1. 每隔7分钟运行一次命令:
      */7 * * * * /root/bin/check-status.sh
      比如说我在今天的10:05分开启了这个定时任务,我的本意是希望这个定时任务是从当前时间开始每隔7分钟执行。但是事实上不是的,crontab的分钟任务是以一个小时为单位和范围的,也就是该任务会在10:07分第一次执行,并每隔7分钟执行一次,待10:56分的这一次执行完成后,下一次并不会在11:03分执行,而是会每隔一小时重新刷新计时,所以下一次会在11:00分执行,再在11:07分执行,以此反复。这就会导致在两个小时的交界处任务的频繁执行,同时,如果我希望任务每隔61分钟执行一次,目前的crontab也无法很好解决。
    2. 每隔10小时运行一次命令:
      0 */10 * * * /root/bin/check-status.sh
      比如说我在今天的9:00 am开启了这个定时任务,我的本意是希望这个定时任务是从当前时间开始每隔10小时执行。但事实上不是的,crontab的小时任务是以一天为单位和范围的,也就是该任务会在10:00 am第一次执行,并每隔10小时执行一次。待20:00pm的这一次执行完成后,由于在等待下一次的执行的过程中,时间来到了两天的交界处,因此定时任务会被重新刷新。也就是下一次任务会在第二天的00:00 am时执行,然后再在10:00am执行,以此反复。这就会导致在两天的交界处任务的频繁执行,同时,如果我希望任务每隔25小时执行一次,目前的crontab也无法很好解决。
    3. 每隔8天运行一次命令:
      0 0 */8 * * /root/bin/check-status.sh
      比如说我在1月的6日开启了这个定时任务,我的本意是希望这个定时任务是从今日开始每隔8日执行。但事实上不是的,crontab的天任务是以一个月为单位和范围的,同时又由于每个月的起始值是1日,也就是该任务会在9日的零时零分第一次执行,然后在17日、25日的零时零分分别执行一次。再之后就到了两个月的交界处,该定时任务会被重新刷新,也就是下一次任务会在2月1日的零时零分执行,以此反复。这就会导致在两个月的交界处任务的频繁执行,同时,如果我希望任务每隔32天执行一次,目前的crontab也无法很好解决。
    4. 每隔5个月执行一次命令:
      0 0 1 */5 * /root/bin/check-status.sh
      比如说我在2020年4月1日开启了这个定时任务,我的本意是希望这个定时任务从本月开始每隔5个月执行。但事实上不是的,crontab的月任务是以一年为单位和范围的,同时又由于每年的起始值是1月,也就是该任务会在6月1日的零时零分第一次执行,然后在11月1日的零时零分执行一次。再之后就到了两年的交界处,该定时任务会被重新刷新,也就是下一次任务会在2021年的1月1日的零时零分执行,以此反复。这就会导致在两年的交界处任务的频繁执行,同时,如果我希望任务每隔13个月执行一次,目前的crontab也无法很好解决。

    解决方法

    基于以上crontab存在的局限性和我的需求(需指定从当前时刻开始每隔多少时间执行一次任务),我摸索了一阵子之后,得到了一个不太华丽的解决办法,但是可以帮助广大网友们在时间短、任务重的情形之下应急使用。
    解决办法同样是在/etc/cron.d/下编写一个定时启动脚本(crontab方面的基础网上都有,请码友们自行补充学习),只是我们的代码略为复杂。脚本内容如下:

    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=""
    lastRunTime=1611803325
    seconds=120
    
    */1 * * * * root source /etc/profile && intervalRunTime=$[ (`date +\%s` - $lastRunTime) \% $seconds ] && if [( $intervalRunTime -ge 0 ]] && [[ $intervalRunTime -lt 60 ]];then echo $intervalRunTime>>$HOME/crontab.log; fi
    

    通过观察以上我编写的代码,大家可以发现我是通过将当前时间绝对秒数作为初始声明变量赋予lastRunTime变量,然后再将间隔时间的秒数(若是间隔2分钟就是120秒,间隔1小时就是3600秒)作为初始声明变量赋予seconds变量。
    之后,每隔一分钟定时任务脚本就会判断intervalRunTime(当前时间绝对秒数-lastRunTime)是否大于等于0并且小于60,若满足条件,则echo intervalRunTime>>intervalRunTime>>HOME/crontab.log(码友们可以将这部分修改为你们自己需要执行的任务)。
    之所以判断条件是大于等于0并且小于60,是因为crontab的最小间隔时间为1分钟,因此将定时任务在每隔seconds后的那一分钟内执行一次。

    我的解决办法仍不够优雅,希望码友们如果想到了更好的解决办法或者有什么疑问的话,欢迎在评论区讨论~

    展开全文
  • 简单描述一下问题:给定个年月日时分秒,在网页中动态显示,距离今天已经有多少,多少小时,多少分钟多少秒. 1.用到的这些jQuery和jscex文件都可以从网上下载,这里不再赘述 2.这里还要引用个.js文件,...

    简单描述一下问题:给定一个年月日时分秒,在网页中动态显示,距离今天已经有多少天,多少小时,多少分钟,多少秒.

    1.用到的这些jQuery和jscex文件都可以从网上下载,这里不再赘述
    <script src=" jquery-1.11.1.min.js "></script>
    <script type="text/javascript" src="jscex.min.js"></script>
    <script type="text/javascript" src="jscex-parser.js"></script>
    <script type="text/javascript" src="jscex-jit.js"></script>
    <script type="text/javascript" src="jscex-builderbase.min.js"></script>
    <script type="text/javascript" src="jscex-async.min.js"></script>
    <script type="text/javascript" src="jscex-async-powerpack.min.js"></script>
    2.这里还要引用一个.js文件,是自己写的,方便操作
    <script type="text/javascript" src="functions.js" charset="utf-8"></script>
    
    具体的内容如下:
    var $win = $(window);
    var clientWidth = $win.width();
    var clientHeight = $win.height();
    
    $(window).resize(function() {
        var newWidth = $win.width();
        var newHeight = $win.height();
        if (newWidth != clientWidth && newHeight != clientHeight) {
            location.replace(location);
        }
    });
    
    (function($) {
    	$.fn.typewriter = function() {
    		this.each(function() {
    			var $ele = $(this), str = $ele.html(), progress = 0;
    			$ele.html('');
    			var timer = setInterval(function() {
    				var current = str.substr(progress, 1);
    				if (current == '<') {
    					progress = str.indexOf('>', progress) + 1;
    				} else {
    					progress++;
    				}
    				$ele.html(str.substring(0, progress) + (progress & 1 ? '_' : ''));
    				if (progress >= str.length) {
    					clearInterval(timer);
    				}
    			}, 75);
    		});
    		return this;
    	};
    })(jQuery);
    
    function timeElapse(date){
    	var current = Date();
    	var seconds = (Date.parse(current) - Date.parse(date)) / 1000;
    	var days = Math.floor(seconds / (3600 * 24));
    	seconds = seconds % (3600 * 24);
    	var hours = Math.floor(seconds / 3600);
    	if (hours < 10) {
    		hours = "0" + hours;
    	}
    	seconds = seconds % 3600;
    	var minutes = Math.floor(seconds / 60);
    	if (minutes < 10) {
    		minutes = "0" + minutes;
    	}
    	seconds = seconds % 60;
    	if (seconds < 10) {
    		seconds = "0" + seconds;
    	}
    	var result = "第 <span class=\"digit\">" + days + "</span> 天 <span class=\"digit\">" + hours + "</span> 小时 <span class=\"digit\">" + minutes + "</span> 分钟 <span class=\"digit\">" + seconds + "</span> 秒"; 
    	$("#clock").html(result);
    }
    

    
    3.不多说了,直接上完整代码,代码上有注释
    <body>
        <div id="clock-box"> <span></span><font color="#33CC00">我们</font> <span>已经是……</span>
          <div id="clock"></div>
        </div>
     </body>
     <script src=" jquery-1.11.1.min.js "></script>
     <script type="text/javascript" src="jscex.min.js"></script>
     <script type="text/javascript" src="jscex-parser.js"></script>
     <script type="text/javascript" src="jscex-jit.js"></script>
     <script type="text/javascript" src="jscex-builderbase.min.js"></script>
     <script type="text/javascript" src="jscex-async.min.js"></script>
     <script type="text/javascript" src="jscex-async-powerpack.min.js"></script>
     <script type="text/javascript" src="functions.js" charset="utf-8"></script>
    	<script>
    		var textAnimate = eval(Jscex.compile("async", function () 
    		{
    		    var together = new Date();
    		    together.setFullYear(2014,10, 15); 			//时间年月日,注意月份是0-11
    		    together.setHours(0);						//小时	
    		    together.setMinutes(0);						//分钟
    		    together.setSeconds(0);						//秒前一位
    		    together.setMilliseconds(0);				//秒第二位
                $("#clock-box").fadeIn(500);
                while (true) {
                    timeElapse(together);
                    $await(Jscex.Async.sleep(1000));
                }
    		}));
    
    		textAnimate().start();
    		
    	</script>

    
    
    4.希望大家有什么不懂得,可以直接查官方文档,穿"一手鞋"。
    快乐学习,快乐编程!
    展开全文
  • /*  @brief 计算传入时间距今多少天/时/分/  @param ... @return 多少天/小时/分钟/前  */ + (NSString *)getTimeStringWithTimeSp:(id)timeSp {  //实例化个NSDat

    /*

     @brief 计算传入时间距今多少天/时/分/秒

     @param timeSp 传入时间戳(有时差),可以是NSNumber、NSString类型

     @return 多少天/小时/分钟/秒前

     */


    + (NSString *)getTimeStringWithTimeSp:(id)timeSp

    {

        //实例化一个NSDateFormatter对象

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

        //设定时间格式,这里可以设置成自己需要的格式

        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

        

        NSDate *pubDate = nil;

        // NSNumber

        if ([timeSp isKindOfClass:[NSNumber class]]) {

            NSNumber *timesp = (NSNumber *)timeSp;

            NSString *str = [timesp stringValue]; //时间戳

            NSTimeInterval timer = [str doubleValue]-28800;//因为时差问题要减8小时 == 28800;

            pubDate = [NSDate dateWithTimeIntervalSince1970:timer];

        }

        // NSString

        else {

            NSString *timesp = (NSString *)timeSp;

            pubDate = [dateFormatter dateFromString:timesp];

        }

        

        // 获取当前时间

        NSDate *curDate = [NSDate date];

        

        // 得到时间秒差

        NSTimeInterval time = [curDate timeIntervalSinceDate:pubDate];

        NSMutableString *timeString = [NSMutableString string];

        

        if (time >= 86400) {

            int day = time/86400;

            [timeString appendFormat:@"%d天前",day];

        }

        else if (time >= 3600) {

            int hour = time/3600;

            [timeString appendFormat:@"%d小时前",hour];

        }

        else if (time >= 60) {

            int minute = time/60;

            [timeString appendFormat:@"%d分钟前",minute];

        }

        else {

            int second = time;

            [timeString appendFormat:@"%d秒前",second];

        }

        

        return timeString;

    }

    展开全文
  • 慕仰8121524我做了一些基准测试,看看最快...如果您的输入毫秒不限于一天(结果可能143:59:59.999),这些从快到慢的选项:// 0.86 msstatic string Method1(int millisecs){ int hours = millisecs / 3600000; ...

    a79848e92b144c791de50a510b06bed0.png

    慕仰8121524

    我做了一些基准测试,看看最快的方法是什么,这些是我的结果和结论。我运行了每个方法10M次并添加了评论,每次运行的平均时间。如果您的输入毫秒不限于一天(结果可能是143:59:59.999),这些是从快到慢的选项:// 0.86 msstatic string Method1(int millisecs){    int hours = millisecs / 3600000;    int mins = (millisecs % 3600000) / 60000;    // Make sure you use the appropriate decimal separator    return string.Format("{0:D2}:{1:D2}:{2:D2}.{3:D3}", hours, mins, millisecs % 60000 / 1000, millisecs % 1000);}// 0.89 msstatic string Method2(int millisecs){    double s = millisecs % 60000 / 1000.0;    millisecs /= 60000;    int mins = millisecs % 60;    int hours = millisecs / 60;    return string.Format("{0:D2}:{1:D2}:{2:00.000}", hours, mins, s);}// 0.95 msstatic string Method3(int millisecs){    TimeSpan t = TimeSpan.FromMilliseconds(millisecs);    // Make sure you use the appropriate decimal separator    return string.Format("{0:D2}:{1:D2}:{2:D2}.{3:D3}",        (int)t.TotalHours,        t.Minutes,        t.Seconds,        t.Milliseconds);}如果您的输入毫秒数限制为一天(结果将永远不会超过23:59:59.999),则这些选项可以从更快到更慢:// 0.58 msstatic string Method5(int millisecs){    // Fastest way to create a DateTime at midnight    // Make sure you use the appropriate decimal separator    return DateTime.FromBinary(599266080000000000).AddMilliseconds(millisecs).ToString("HH:mm:ss.fff");}// 0.59 msstatic string Method4(int millisecs){    // Make sure you use the appropriate decimal separator    return TimeSpan.FromMilliseconds(millisecs).ToString(@"hh\:mm\:ss\.fff");}// 0.93 msstatic string Method6(int millisecs){    TimeSpan t = TimeSpan.FromMilliseconds(millisecs);    // Make sure you use the appropriate decimal separator    return string.Format("{0:D2}:{1:D2}:{2:D2}.{3:D3}",        t.Hours,        t.Minutes,        t.Seconds,        t.Milliseconds);}如果你的输入只是几秒钟,那么方法会稍快一点。同样,如果您的输入秒数不限于一天(您的结果可能是143:59:59):// 0.63 msstatic string Method1(int secs){    int hours = secs / 3600;    int mins = (secs % 3600) / 60;    secs = secs % 60;    return string.Format("{0:D2}:{1:D2}:{2:D2}", hours, mins, secs);}// 0.64 msstatic string Method2(int secs){    int s = secs % 60;    secs /= 60;    int mins = secs % 60;    int hours = secs / 60;    return string.Format("{0:D2}:{1:D2}:{2:D2}", hours, mins, s);}// 0.70 msstatic string Method3(int secs){    TimeSpan t = TimeSpan.FromSeconds(secs);    return string.Format("{0:D2}:{1:D2}:{2:D2}",        (int)t.TotalHours,        t.Minutes,        t.Seconds);}如果您的输入秒数限制为一天(您的结果将永远不会超过23:59:59):// 0.33 msstatic string Method5(int secs){    // Fastest way to create a DateTime at midnight    return DateTime.FromBinary(599266080000000000).AddSeconds(secs).ToString("HH:mm:ss");}// 0.34 msstatic string Method4(int secs){    return TimeSpan.FromSeconds(secs).ToString(@"hh\:mm\:ss");}// 0.70 msstatic string Method6(int secs){    TimeSpan t = TimeSpan.FromSeconds(secs);    return string.Format("{0:D2}:{1:D2}:{2:D2}",        t.Hours,        t.Minutes,        t.Seconds);}作为最后的评论,让我补充一点,我注意到string.Format如果你使用D2而不是更快一点00。

    展开全文
  • 现在很多网站的时间显示都很人性化,不再单纯的年月日时分秒,而是根据数据更新的时间与当前时间进行比较,实现多少秒前,多少分钟前,多少小时前! 代码: 1 function format_date($time){...
  • 一天之中,时针和分针共重叠多少次?你知道它们重叠时的具体时间吗? 正确思路: 这可以归结为速度差的相遇问题,分钟每走一圈多都会和时针相遇。重点算相遇的具体时间: 0点0分一次 1点5分多一点(准确说是1×...
  • 我们在评论中往往会看到多少天前,多少小时前。  实现原理:现在时间-过去时间 得到的时间差来做比较 下面我定义了个Helper类,大家直接引用即可,参数就是时间差,注意时间差类型TimeSpan类型,而不是...
  • 我们在评论中往往会看到多少天前,多少小时前。 实现原理:现在时间-过去时间 得到的时间差来做比较 下面我定义了个Helper类,大家直接引用即可,参数就是时间差,注意时间差类型TimeSpan类型,而不是DateTime...
  • 通过时间戳的方式获取到相差的天数 1、假设时间A-2019-11-12 13:14:15,那么输出...3、一天内的毫秒值:1天*24小时*60分钟*60*1000毫秒=1*24*60*60*1000,如下 4、两个时间戳相减,1575090855000-1573535655...
  • 计算指定时间与当前的时间差 比如,3前、10分钟前(这个在项目中经常遇到,所以记录了下来) ... * @return 多少(or分oror月or年)+前 (比如,3前、10分钟前)   */ +(NSString *)
  • 其相同点在于访问https协议网站...根据是否变化分类,可以分为动态代理IP和静态代理IP,动态代理IP经常变动,短则几就变,长则几十分钟次,动态代理又分为短效代理和隧道代理;静态代理IP固定不变,短则不.
  • TimeUnit是一个枚举类型,可以将时间方便快捷的转换为(、时、...1、我们将1个小时转换为多少分钟多少秒 1小时转换分钟数为60分钟 TimeUnit.HOURS.toMinutes(1) =>60 1小时转换分钟数为3600秒 TimeUnit.HOURS.t...
  • oracle 求两个时间段相差分钟

    千次阅读 2018-03-06 16:03:08
    在oracle 中,时间加减运算后的结果以天为单位的,如果想得到,则乘以 86400(一天数 24*60*60) 就好了 想得到分 24*60 --天 select (to_date( t.A,'yyyy-mm-dd hh24:mi:ss')- to_d...
  • 计算秒数是多少天多少小时多少分钟多少秒 int second = 865445564; //给秒数赋值 int day = second / (60 * 60 * 24); //计算天数 second=second% (60 * 60 * 24...
  • 两个时间相差多少 .net中的timespan应用2008/11/10 11:54TimeSpan 对象表示时间间隔或持续时间,按正负天数、小时数、分钟数、数以及的小数部分进行度量。用于度量持续时间的最大时间单位是天。更大的时间单位...
  • 两个时间相差多少 .net中的timespan应用2008/11/10 11:54TimeSpan 对象表示时间间隔或持续时间,按正负天数、小时数、分钟数、数以及的小数部分进行度量。用于度量持续时间的最大时间单位是天。更大的时间单位...
  • 4. 通过相差的毫秒数换算出 多少天多少小时多少分钟多少秒 4-1. 换算天数 总的秒数 / 一天的秒数 得到的就是 多少天(小数) 我们只需要整天数, 不够整天的按照小时算 Math.floor() 取整一下 4-2. 换算小时 总的秒数...
  • 软件介绍: 款多功能的单位换算工具,能够进行长度、面积、体积、质量、力、发光强度、温度亮度、压强及功...例如,能够换算1年是多少个月,多少,一年共计多少小时,多少分钟多少秒,总之是款很实用的小工具。
  • 求两个时间的时间差

    2020-05-23 16:32:56
    通过相差的毫秒数换算出 多少天多少小时多少分钟多少秒 换算天数 总的秒数 / 一天的秒数 得到的就是 多少天(小数) 我们只需要整天数, 不够整天的按照小时算 Math.floor() 取整一下 换算小时 总的秒数
  • TimeUnit是一个枚举类型,可以将时间方便快捷的转换为(、时、分、秒、...1、我们将1个小时转换为多少分钟多少秒 1小时转换分钟数为60分钟 TimeUnit.HOURS.toMinutes(1) =>60 1小时转换分钟数为3600秒 ...
  • 甚至显示还剩余多少小时,多少分钟多少秒。Date Time Counter 用来统计您过去或将来的重要事件距当前时间的年、月、周、、时、分、秒数,例如出生、结婚及周年纪念。对于将来事件,它相当于个倒计时器;...
  • Java8日期和时间段的计算

    千次阅读 2020-02-25 16:50:30
    在编写代码的过程中,计算个方法具体耗时多少分钟,执行了多少秒等需求,一般也借助System.currentTimeMillis()。 long start = System.currentTimeMillis(); //业务逻辑 //... long end = ...
  • js怎么计算时间差

    2016-05-10 19:05:56
    如题,时间A,时间B,计算两个时间差。 js里有个方法parse();Date的方法。 它返回1970年到某的...再用这个数字算出相差多少年,多少月,多少日,多少小时,多少分钟多少秒,甚至多少毫秒。就ok了。 ...
  • 通过比较差值与60秒,1小时,2大小,判断是多少秒前,多少分钟前,昨天,前天,或具体日期具体可看代码 代码已经封装,可以放到独立的js文件作为单独的工具函数使用 /* eslint-disable */ // 分,时,,转秒 ...

空空如也

空空如也

1 2 3 4
收藏数 73
精华内容 29
关键字:

一天是多少分钟多少秒