zoukankan      html  css  js  c++  java
  • shell的date命令:使用方法,以及小时、分钟的计算

    shell命令格式严格,不像python那样命令行中可以添加空格。如等号两边无空格。有多余空格错误,日期date命令就是最明显的例子。

     

    命令格式:

    date [-u] [-d datestr] [-s datestr] [--utc] [--universal][--date=datestr] [--set=datestr] [--help] [--version] [+FORMAT][MMDDhhmm[[CC]YY][.ss]]

    如:

    date +%Y%m%d             :以yyyymmdd格式输出(20111118)
    date --date="1 day ago" +%Y%m%d :一天前的日期

    date -d "-2 day 20111111" +%Y%m%d

    day="20111111"  

    for i in `seq 0 6`     :循环看 参数顺序无关,命令都一样
    do
        date -d "$day +$i day" +%Y%m%d   :正数可以省略符号
        
    date +%Y%m%d -d "$day +$i day" 

        date +%Y%m%d -d "$i day $day "

        date +%Y%m%d -d "+$i day $day "
        
    date +%Y%m%d -d $day

    done


    格式注意

    1,date后面每个空格之间都是一个独立的参数,分别看做整体,用双引号格式能看的更为清楚,如date "+%Y%m%d %H:%M:%S" -d "+1 hour"

            i.             -d“-2 day20111111”指定输出内容

            ii.             “+%Y%m%d”是一个整体,控制输出格式,+后面无空格

    2,参数顺序无关,如

                    date -d "-2 day 20111111" +%Y%m%d

                   date +%Y%m%d -d "-2 day 20111111"

    date +%Y%m%d -d "20111111 -2 day"

           都一样。

    3,独立参数有无双引号都行,

    date -d 2014-02-13 +%s和date -d"2014-02-13" "+%s"是一样的,还有date -d'2014-02-13' +%s


    时间字符串的转化:

    用date 的输出格式控制实现,但“月日年”和“时分秒”必须分开处理,否则会无法识别。such as

    2013-10-30 20:12:59 或者 20131030 20:12:59

    注意:

    1,二者用空格分割;

    2,年月日作为整体,格式十分灵活,可以随意写。但时分秒必须用冒号”:”分开,否则无法识别。

    1 date字符串与时间戳格式互转:

    A)字符串转时间指定格式:

    计算2011111前两天    

    date -d "-2 day 20111111" +%Y%m%d   (输出为 20111109)     

    或者date --date="20130913"+%Y%m%d

    B)字符串转换为时间戳:

    date -d "2010-10-18 00:00:00" +%s    (输出  1287331200)

    -d参数指定字符串,+%s表示输出时间戳。

    C)时间戳转换为字符串:

    date -d '1970-01-01 UTC 1287331200 seconds' +"%Y-%m-%d %T"(输出2010-10-18 00:00:00)

            或者直接用@符号 

             date -d @1287331200 "+%Y-%m-%d


    D)时间戳的日期计算:

    seconds=`date -d "2010-10-18 00:00:00" +%s`     #得到时间戳

    seconds_new=`expr $seconds + 86400`          #加上一天的秒数86400

    date_new=`date -d @$seconds_new "+%Y-%m-%d"`   #获得指定日前加上一天的日前

    2 分钟计算的两种方法:

    1)date时间计算,输出用格式控制符:

    date "+%Y-%m-%d %H:%M:%S" -d "-15 minute$yearof-$monthof-$dayof 20:12:59"

    例子:

    yearof="2013"

    monthof="10"

    dayof="30"

    nowth=1

    echo $nowth

    echo $dayof

    date "+%G-%m-%d %H:%M:%S" -d "2013-10-3020:12:59"

    date "+%Y%m%d%H%M%S" -d "2013-10-30 20:12:59"

    mytime=`date "+%Y-%m-%d %H:%M:%S" -d"$yearof-$monthof-$dayof 20:12:59"`

    echo "$mytime is"

    mytime=`date "+%Y-%m-%d %H:%M:%S" -d "-15 minute$yearof-$monthof-$dayof 20:12:59"`

    echo "$mytime now is"

    nowtime=`date "+%Y%m%d%H%M%S" -d"$yearof-$monthof-$dayof 20:12:59"`

    #time must be with :, if no, wrong

    echo "$nowtime is"

    nowtime=`date "+%Y%m%d%H%M%S" -d "-15 minute${yearof}${monthof}${dayof} 20:12:59"`

    echo "$nowtime now is"

    2)转为时间戳计算:

    #date "+%Y-%m-%d %H:%M:%S" -d "20131030203859"

    #date -d "$yearof-$monthof-$dayof 14:32:12" +%s

    #date -d "$yearof-$monthof-$dayof 14:32:12" +%s

    3 屏蔽字符串,如分和秒归0:

    true_time="2013-09-15 15:36:11"

    start_time=`date "+%Y%m%d%H0000" -d"$true_time"`

    echo $start_time

    ##mytime=`date -d "$start_time" "+%s"`#invalid

    test_time=`date "+%Y-%m-%d %H:00:00" -d"$true_time"`

    echo $test_time

    #转时间戳

    start_time=`date -d "$test_time" "+%s"`

    echo $start_time

    4 按日期循环执行的shell:

    oneday="20141103"

    dbname="wizad"

    set -x

    for i in `seq 0 60`

    do

        onedayid=$(date -d"${oneday} +$i day" +%Y-%m-%d)

         hive -e "use${dbname};

         alter tablewizad_mdm_cleaned_hdfs add partition (day='${onedayid}',adn='3') location'/user/wizad/data/wizad/raw/${onedayid}/3_1/';

         alter tablewizad_mdm_cleaned_hdfs add partition (day='${onedayid}',adn='5') location'/user/wizad/data/wizad/raw/${onedayid}/5_1/';

         "

    done

    5 一些date常用案例:

    1,将增加时间变成秒

     time2=$((1*60*60+20*60))

     echo$time2

    4800

    2,两个时间相加,计算出结果时间

    time1=$(date +%s -d '1990-01-01 01:01:01')

    time1=$(($time1+$time2))

    time1=$(date +%Y-%m-%d %H:%M:%S -d"1970-01-01 UTC $time1 seconds");

    echo $time1

    1990-01-01 02:21:01

    3,时间差计算方法

    如:2010-01-01 与 2009-01-01 11:11:11 时间差

    原理:同样转成时间戳,然后计算天,时,分,秒

    time1=$(($(date +%s -d '2010-01-01') -$(date +%s -d '2009-01-01 11:11:11')));

    echo time1

    将time1 / 60 秒,就变成分了。

    4,小时的计算:

    date#当前时间

    current_time=`date "+%Y-%m-%d%H:00:00" -d "-1 hour"` #取一小时前的时间,分秒清零

    echo $current_time

    start_time=`date -d"$current_time" "+%s"`#转化为时间戳

    echo $start_time

    end_time=`date "+%Y%m%d %H:%M:%S"-d "+1 hour ${current_time}"`#

    echo $end_time

    my_time=`date "+%Y-%m-%d%H:00:00"`

    echo $my_time

    上面两个都是取当前时间的分秒清零。

    t_time=`date -d "$my_time""+%s"`

    echo $t_time

    t2_time=$((start_time+3600))  #注意,转化为时间戳后可以直接计算,用shell的简便计算符$((表达式)),直接求出一小时后的时间(时间戳格式)

    echo $t2_time


  • 相关阅读:
    ChinaUnionPay、Visa和MasterCard信用卡号验证
    使用Aspose.Cells 过程中用过的知识(转)
    在网页中回车默认按钮
    求素数算法
    通过jQuery的attr修改onclick(转)
    子页面js代码改变父页面iframe的大小(转)
    考虑线程安全但效率不高的单例C++代码
    Linux信号量摧毁/销毁
    WCF、WPF、Silverlight和区别(转)
    不考虑线程安全的初级单例C++代码
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6205584.html
Copyright © 2011-2022 走看看