显示时间是个常用的命令,在写shell脚本中也经常会用到与日期相关文件名或时间显示。无论是linux还是windows下都是date命令。

Linux下date命令用法

  • date [OPTION]… [+FORMAT]
  • date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

date命令参数

  • -d, –date=STRING  显示STRING指定的时间
  • -f, –file=DATEFILE  类似–date参数显示DATEFILE文件中的每行时间
  • -ITIMESPEC, –iso-8601[=TIMESPEC]  以ISO  8601 格式显示日期/时间。TIMESPEC为”date”(只显示日期)、”hours”、”minutes”、”senconds”(显示时间精度)之一,默认为”date”。
  • -r, –reference=FILE  显示文件的最后修改时间
  • -R, –rfc-2822  以RFC-2822兼容日期格式显示时间
  • -s, –set=STRING  设置时间为STRING
  • -u, –utc, –universal  显示或设定为Coordinated Universal Time时间格式

 

date命令输出显示格式

  • %%    字符%
  • %a     星期的缩写(Sun..Sat)
  • %A    星期的完整名称 (Sunday..Saturday)
  • %b     月份的缩写(Jan..Dec)
  • %B     月份的完整名称(January..December)
  • %c     日期时间(Sat Nov 04 12:02:33 EST 1989)
  • %C     世纪(年份除100后去整) [00-99]
  • %d     日期,一个月的第几天(01..31)
  • %D     日期(mm/dd/yy)
  • %e     一个月的第几天 ( 1..31)
  • %F    日期,同%Y-%m-%d
  • %g     年份(yy)
  • %G     年份(yyyy)
  • %h     同%b
  • %H    小时(00..23)
  • %I     小时(01..12)
  • %j     一年的第几天(001..366)
  • %k     小时( 0..23)
  • %l      小时( 1..12)
  • %m    月份(01..12)
  • %M    分钟(00..59)
  • %n     换行
  • %N     纳秒(000000000..999999999)
  • %p     AM or PM
  • %P     am or pm
  • %r     12小时制时间(hh:mm:ss [AP]M)
  • %R    24小时制时间(hh:mm)
  • %s     从00:00:00 1970-01-01 UTC开始的秒数
  • %S     秒(00..60)
  • %t     制表符
  • %T    24小时制时间(hh:mm:ss)
  • %u     一周的第几天(1..7);  1 表示星期一
  • %U     一年的第几周,周日为每周的第一天(00..53)
  • %V     一年的第几周,周一为每周的第一天 (01..53)
  • %w     一周的第几天 (0..6);  0 代表周日
  • %W    一年的第几周,周一为每周的第一天(00..53)
  • %x     日期(mm/dd/yy)
  • %X     时间(%H:%M:%S)
  • %y     年份(00..99)
  • %Y     年份 (1970…)
  • %z     RFC-2822 风格数字格式时区(-0500)
  • %Z     时区(e.g., EDT), 无法确定时区则为空

 

以下是做的一些实验,便于理解

$ date -d "2010-11-15 23:00:01"
Mon Nov 15 23:00:01 PST 2010
$ date -d "2010/11/15 23:0:2"
Mon Nov 15 23:00:02 PST 2010
$ date -d "2010/11/15T23:0:2"
Mon Nov 15 08:00:02 PST 2010
$
$ echo "2010-11-15 23:00:01" > date.txt
$ echo "2010/11/15 23:00:02" >> date.txt
$ cat date.txt
2010-11-15 23:00:01
2010/11/15 23:00:02
$ date -f date.txt
Mon Nov 15 23:00:01 PST 2010
Mon Nov 15 23:00:02 PST 2010
$
$ ls -l
total 4
-rw-r--r-- 1 znan sybase    40 Nov 15 21:14 date.txt 
$ date -r date.txt
Mon Nov 15 21:14:36 PST 2010
$
$ date -I
2010-11-15
$ date -Ihours
2010-11-15T21-0800
$ date -Iminutes
2010-11-15T21:16-0800
$ date -Iseconds
2010-11-15T21:16:24-0800
$
$ date -R
Mon, 15 Nov 2010 21:47:08 -0800
$ date -u
Tue Nov 16 05:47:13 UTC 2010
$
$ date +"Today is %A."
Today is Monday.
$ date +"Date:%b. %e, %G"
Date:Nov. 15, 2010
$ date +"Date: %b.%e, %G"
Date: Nov.15, 2010
$ date +"%x %X"
11/15/2010 09:50:21 PM
$ date +"%Y-%m-%d %H:%M:%S"
2010-11-15 21:51:32
$ date +"%Y-%m-%d %I:%M:%S %p"
2010-11-15 09:51:55 PM

 

Linux date 常用时间格式

date=$(date "+%Y-%m-%d___%H:%M:%S")

echo date
2012-08-16___05:52:20

 

date "+%Y-%m-%d"
2012-08-16

------------------------------------

Linux date 日期加减运算

date            // 默认时间格式
Thu Aug 16 05:42:38 UTC 2012

 

date +" %b %e, %G "            // 定制格式
Aug 16, 2012

 

date +"%b %e, %G" -d' -1 day ' date -d'- 1 day ' +"%b %e, %G"    // 减一天(加一天类似)
Aug 15, 2012

 

date +"%b %e, %G" -d' +1 month ' date -d' +1 month ' +"%b %e, %G" // 加一月(减一月类似)
Sep 16, 2012

 

date +"%Y年%m月%d日"
2012年08月20日

 

date +"%Y年%m月%d日" -d' -1 day '    // 同上面加减1天(或加减1月)
2012年 08 月19日

 

date +"%Y年%- m 月%d日"     // % -m 去除月份对其的
2012年 8 月20日

 

Linux Shell 指定日期加减
# date -d"yesterday 20160521" +%Y%m%d     
20160520
# date -d"yesterday 20160521" +%Y-%m-%d
2016-05-20
# date -d"-1 day 20160521" +%Y%m%d           
20160520
# date -d"1 day ago 20160521" +%Y%m%d
20160520
# date -d"-1 month 20160521" +%Y%m%d   
20160421

 

Linux Shell 计算时间差

vim  cal_dtime.sh 

#!/bin/bash
#
# mimvp.com
# 2017.09.01

echo "mimvp.com  by  Sandy"

## 日期格式的换行
echo `date "+%n%n"`

echo "日期格式转为时间戳, 单位秒"
dtime=$(date +%s -d "2016-09-12 00:00:00")
echo "2016-09-12 00:00:00 : $dtime"

echo ""
echo ""


echo "统计时间差,采用 %s 单位为秒"
time1=$(date +%s)
sleep 2.5
time2=$(date +%s)
time_delta=$(($time2 - $time1))
echo $time2 , $time1 , $time_delta

echo ""
echo ""


echo "计算日期格式的时间差"
dtime_start='2016-09-12 00:00:00'
dtime_end='2018-09-20 23:59:59'
time1=$(date +%s -d "$dtime_start")
time2=$(date +%s -d "$dtime_end")
time_delta=$(($time2 - $time1))
echo $dtime_start , $dtime_end
echo $time2 , $time1 , $time_delta

delta_second=$(($time_delta % 60))
delta_minute=$(($time_delta / 60 % 60))
delta_day=$(($time_delta / 3600 / 24 % 365))
delta_year=$(($time_delta / 3600 / 24 / 365))
echo $time_delta , $delta_year years, $delta_day days, $delta_minute minutes, $delta_second seconds

echo ""
echo ""


echo " 通过函数,计算日期格式的时间差 "

function cal_time_delta(){
    dtime_start="$1"
    dtime_end="$2"

    time1=$(date +%s -d "$dtime_start")
    time2=$(date +%s -d "$dtime_end")
    time_delta=$(($time2 - $time1))

    echo $(($time_delta))
}

dtime_start='2016-09-12 00:00:00'
dtime_end='2018-09-20 23:59:59'

time_delta=$(cal_time_delta "${dtime_start}" "${dtime_end}")
echo $dtime_start , $dtime_end , $time_delta

delta_second=$(($time_delta % 60))
delta_minute=$(($time_delta / 60 % 60))
delta_day=$(($time_delta / 3600 / 24 % 365))
delta_year=$(($time_delta / 3600 / 24 / 365))
echo $time_delta , $delta_year years, $delta_day days, $delta_minute minutes, $delta_second seconds

运行结果:

$ ./cal_time.sh   
mimvp.com  by  Sandy

日期格式转为时间戳, 单位秒
2016-09-12 00:00:00 : 1473609600


统计时间差,采用 %s 单位为秒
1504330014 , 1504330011 , 3


计算日期格式的时间差
2016-09-12 00:00:00 , 2018-09-20 23:59:59
1537459199 , 1473609600 , 63849599
63849599 , 2 years, 8 days, 59 minutes, 59 seconds


 通过函数,计算日期格式的时间差 
2016-09-12 00:00:00 , 2018-09-20 23:59:59 , 63849599
63849599 , 2 years, 8 days, 59 minutes, 59 seconds

 

Shell 模计算

$ echo `expr 5 % 3`

 

Shell 单括号运算

$ a=$(date) && echo $a
2017年 09月 02日 星期六 13:29:26 CST
$ a=`date` && echo $a       
2017年 09月 02日 星期六 13:29:39 CST

 

Shell 双括号运算

$ a=$((20 + 12)) && echo $a 
32
$ a=`expr 20 + 12` && echo $a     
32

 

Ubuntu 修改系统时间

sudo date -s MM/DD/YY

sudo date -s hh:mm:ss

 

注意,这里说的是系统时间,是linux由操作系统维护的。

在系统启动时,Linux操作系统将时间从CMOS中读到系统时间变量中,以后修改时间通过修改系统时间实现。

为了保持系统时间与CMOS时间的一致性,Linux每隔一段时间会将系统时间写入CMOS

由于该同步是每隔一段时间(大约是11分钟)进行的,在我们执行date -s后,

如果马上重起机器,修改时间就有可能没有被写入CMOS,这就是问题的原因。

 

如果要确保修改的硬件时间生效,可以执行如下命令。
sudo dw clock -w 或 sudo clock -w (ubuntu下有时候无法用clock -w 没有这个命令,如果没有就使用这个hwclock -w
这个命令强制把系统时间写入CMOS。

 

查看硬件时间

sudo hwclock --show

$ sudo hwclock --show
Thursday, August 16, 2012 PM04:46:32 UTC  -0.664019 seconds

 

核心提示:让VMware虚拟机上的ubuntu10.10时间与网络同步

每次启动虚拟机后,ubuntu10.10的时间都不合适,发现需要这样设置:

系统–>系统管理–>时间和日期
时区选择:Asia/Chongqing
配置选择:与互联网服务器保持同步
(这时提示需要安装名称为ntp的软件,安装即可,安装后提示要替换一个文件,选择“替换“)
时间服务器选择:time.nuri.net(Korea, Asia)

查看文件命令: ls -l ls -l --time-style=long-iso

 

ls 显示文件的最后日期的格式

方式1ls -l --full-time

# ls -l --full-time
drwxr-xr-x  3 root root     4096 2018-04-04 19:35:02.594000000 +0800 tree-1.7.0
-rw-r--r--  1 root root    47082 2017-09-18 15:51:05.000000000 +0800 tree-1.7.0.tgz
-rw-r--r--  1 root root   119437 2019-07-29 12:03:35.785852613 +0800 webip_history.txt
-rw-r--r--  1 root root       14 2019-07-29 12:03:35.757852613 +0800 webip_old.txt

方式2ls -l --time-style=full-iso  (同方式1)

# ls -l --time-style=full-iso
drwxr-xr-x  3 root root     4096 2018-04-04 19:35:02.594000000 +0800 tree-1.7.0
-rw-r--r--  1 root root    47082 2017-09-18 15:51:05.000000000 +0800 tree-1.7.0.tgz
-rw-r--r--  1 root root   119437 2019-07-29 12:03:35.785852613 +0800 webip_history.txt
-rw-r--r--  1 root root       14 2019-07-29 12:03:35.757852613 +0800 webip_old.txt

方式3ls -l --time-style +'%Y-%m-%d___%H:%M:%S.%N'

# ls -l --time-style +'%Y-%m-%d___%H:%M:%S.%N'
drwxr-xr-x  3 root root     4096 2018-04-04___19:35:02.594000000 tree-1.7.0
-rw-r--r--  1 root root    47082 2017-09-18___15:51:05.000000000 tree-1.7.0.tgz
-rw-r--r--  1 root root   119437 2019-07-29___12:03:35.785852613 webip_history.txt
-rw-r--r--  1 root root       14 2019-07-29___12:03:35.757852613 webip_old.txt

 

 

crontab 定时脚本打印日期

方式1* * * * * /usr/bin/date  >> /root/script/dtime_now.txt

# cat /root/script/dtime_now.txt 
Mon Jul 29 13:03:01 CST 2019

 

方式2* * * * * /usr/bin/date +"\%Y-\%m-\%d___\%H:\%M:\%S.\%N"  >> /root/script/dtime_now.txt

# cat /root/script/dtime_now.txt 
2019-07-29___13:36:01.946686263

 

方式3* * * * * echo $(/usr/bin/date +"\%Y-\%m-\%d___\%H:\%M:\%S")  >> /root/script/dtime_now.txt

# cat /root/script/dtime_now.txt 
2019-07-29___13:38:01

 

给出完整的 crontab 脚本

# For more information see the manual pages of crontab(5) and cron(8)
# 
# 每五分钟执行一次              */5 * * * *
# 每小时执行一次        0 * * * *
# 每天执行一次          0 0 * * *
# 每周执行一次          0 0 * * 0
# 每月执行一次          0 0 1 * *
# 每年执行一次          0 0 1 1 *
#
# m h  dom mon dow   command
SHELL=/bin/sh

3 * * * * /usr/bin/date  >> /root/script/dtime_now.txt
* * * * * echo $(/usr/bin/date +"\%Y-\%m-\%d___\%H:\%M:\%S")  >> /root/script/dtime_now.txt
* * * * * /usr/bin/date +"\%Y-\%m-\%d___\%H:\%M:\%S.\%N"  >> /root/script/dtime_now.txt

 

 

参考推荐:

Linux / MacOS 修改 ls 显示年月日的时间格式

CentOS 修改date系统时间

AWS EC2修改系统时区

Linux 命令快捷键

Linux 常用命令大全

Linux cut 命令

Linux lsof 命令详解

Linux vmstat 命令详解

Linux rc.local 命令不执行

Linux expect 命令无需输入密码登陆

Linux date日期格式及加减运算

 

原文: Linuxdate日期格式及加减运算