date计算时间差¶
简单输出UNIX秒:
date +%s
在shell中将时间转换成1970年开始的秒,则可以进行计算,date -d +%s
可以输出当前时间的UNIX秒。
脚本案例:
CURTIME=`date +"%Y-%m-%d %H:%M:%S"` #当前的系统时间 2009-05-04 14:34:00
LASTLINE=$(ls -lt * "$v_DIRNAME"| line | awk '{print $6,$7,$8}') #获取文件的最后时间 2009-10-04 14:30:00
echo "lasttime "$LASTLINE
echo "Systime "$CURTIME
Sys_data=`date -d "$CURTIME" +%s` #把当前时间转化为Linux时间
In_data=`date -d "$LASTLINE" +%s`
interval=`expr $Sys_data - $In_data` #计算2个时间的差
echo $In_data
echo $Sys_data
echo $interval
如果要计算日期差异,可以使用 bc
命令计算:
echo "$interval / 3600 /24" | bc
参考 Convert date time string to epoch in Bash 和 How to convert DATE to UNIX TIMESTAMP in shell script on MacOS 需要注意不同平台转换格式有区别:
Linux平台希望输入的日期格式是 US 或 ISO860 格式,类似
mm/dd/yyyy
或者yyyy-mm-dd
,素以你可以使用date --date='06/12/2012 07:21:22' +"%s"
macOS平台采用的格式是
date -j -f "%a %b %d %T %Z %Y" "Tue Sep 28 19:35:15 EDT 2010" "+%s"
或者
date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"
需要注意macOS需要提供格式参数 -f
否则会报错,举例:
date -j -f "%Y-%m-%d" "2010-10-02" "+%s"
则输出 1286009053
或者:
date -j -f "%m/%d/%Y" '07/06/2021' +"%s"
输出 1625561120
很不幸,macOS的转换方法和Linux不能兼容(linux不支持 -j
并且一定要使用 -d
),所以如果要脚本通用,需要判断平台,否则报错
时间差计算可以使用上述 expr $Sys_data - $In_data
,也可以使用单括号运算符$()
:
interval=$($Sys_data - $In_data)
获取当前时间的几分钟或几小时前时间¶
10分钟前
$date -d "10 minute ago" +"%Y-%m-%d %H:%M"
2017-10-12 17:50
$date -d "-10 minute" +"%Y-%m-%d %H:%M"
2017-10-12 17:50
上述 -d
参数也可以使用 --date
方式,类似要获取1分钟前时间
date --date="-1 minutes" '+%Y-%m-%d %T'
或者一秒钟前时间:
date --date="+1 seconds" '+%Y-%m-%d %T'
一小时前
date --date="-1 hours" +"%Y-%m-%d %H:%M"
一天前
date --date="-1 days" +"%Y-%m-%d %H:%M"
-d
和--date
等同
日期格式的转换¶
在前面的两个案例中,date
命令有一个很重要和有用的参数-d
,这个参数的含义是让date
命令不是从当前时钟读取,而是从指定变量读取。正是有了这个变量,上述案例才能从各个变量中获取值,然后利用+
符号进行格式转换。
最常用的方式就是把两个时间变量转换成秒(+%s
)然后进行相减计算,例如,从日志文件中获取时间戳,然后和当前时间进行相减计算,以获知日志时间和当前的时间差距。
另外,GNU coreutils >= 5.3还支持支持一种类似以下的@
格式
date -d @1234567890
可以从时间秒格式传换出时间格式。上述格式还可以使用变量:
date -d @${i} +"%T"
可以将指定日期时间转换成时间戳:
$ date -d '06/12/2018 07:21:22' +"%s"
1528759282
$ date -d '2018-06-12 07:21:22' +"%s"
1528759282
$ date -d "04 June 1989"
1989年 06月 04日 星期日 00:00:00 CDT