Linux Command - date

date命令功能:显示或设置系统时间与日期。

date命令用法:

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

date [-d <字符串>][-u][+%H%I%K%l%M%P%r%s%S%T%X%Z%a%A%b%B%c%d%D%j%m%U%w%x%y%Y%n%t] 或date [-s <字符串>][-u][MMDDhhmmCCYYss] 或 date [--help][--version]

补充说明:
第一种语法可用来显示系统日期或时间,以%为开头的参数为格式参数,可指定日期或时间的显示格式。
第二种语法可用来设置系统日期与时间。只有管理员才有设置日期与时间的权限。若不加任何参数,data会显示目前的日期与时间。

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

#date
//显示当前日期
#date -s
//设置当前时间,只有root权限才能设置,其他只能查看。
例如:
#date -s 20061010 //设置成20061010,这样会把具体时间设置成空00:00:00

#date -s 12:23:23 //设置具体时间,不会对日期做更改

若设置时间为下午14点36分。
# date -s 14:36:00
Fri Nov 26 14:15:00 CST 1999
若设置时间为1999年11月28号。
# date -s 991128
Sun Nov 28 00:00:00 CST 1999
#date -s “12:12:23 2006-10-10″ //这样可以设置全部时间

Date 命令参数小技巧
 
由于Linux对man date -d 参数说的比较模糊,故举例如下:
# -d, --date=STRING  display time described by STRING, not `now'
For Linux
[root@linuxso.com ~ ]# date -d next-day +%Y%m%d
20060328
[root@linuxso.com ~ ]# date -d last-day +%Y%m%d
20060326
[root@linuxso.com ~ ]# date -d yesterday +%Y%m%d
20060326
[root@linuxso.com ~ ]# date -d tomorrow +%Y%m%d
20060328
[root@linuxso.com ~ ]# date -d last-month +%Y%m
200602
[root@linuxso.com ~ ]# date -d next-month +%Y%m
200604
[root@linuxso.com ~ ]# date -d next-year +%Y
2007

在linux环境下要取得几天前的时期只要使用
date -d "x days ago" +%Y%m%d
x用数字代替,如果需要几天前的直接写正数,如果要几天后的日期直接写负数即可;
date -d "x weeks ago" +%Y%m%d
x用数字代替,如果需要几周前的直接写正数,如果要几周后的日期直接写负数即可;
date -d "x years ago" +%Y%m%d
x用数字代替,如果需要几年前的直接写正数,如果要几年后的日期直接写负数即可;
看下面例子:
[root@linuxso.com ~]# date +%Y%m%d
20100107
上面是今天的日期20100107
[root@linuxso.com ~]# date -d "2 days ago" +%Y%m%d         
20100105
 
上面是两天前的日期
[root@linuxso.com ~]# date -d "4 days ago" +%Y%m%d 
20100103
上面是四天前的日期
 
[root@linuxso.com ~]# date -d "-1 days ago" +%Y%m%d
20100108
上面是一天后的日期
[root@linuxso.com ~]# date -d "-2 days ago" +%Y%m%d 
20100109
上面是两天后的日期
[root@linuxso.com ~]# date -d "1 week ago" +%Y%m%d      
20091231
上面是一周前的日期
[root@linuxso.com ~]# date -d "1 year ago" +%Y%m%d    
20090107
上面是一年前的日期

扩展知识: 
设置完系统时间后,还需要同步到硬件时钟上
# clock --systohc
硬件时钟与系统时钟同步:
# hwclock --hctosys
或者
# clock --hctosys
上面命令中,--hctosys表示Hardware Clock to SYStem clock。
系统时钟和硬件时钟同步:
# hwclock --systohc
或者
# clock --systohc

FYI.
CST:中国标准时间(China Standard Time),这个解释可能是针对RedHat Linux。

UTC:协调世界时,又称世界标准时间,简称UTC,从英文国际时间/法文协调时间”Universal Time/Temps Cordonné”而来。中国大陆、香港、澳门、台湾、蒙古国、新加坡、马来西亚、菲律宾、澳洲西部的时间与UTC的时差均为+8,也就是UTC+8。

GMT:格林尼治标准时间(旧译格林威治平均时间或格林威治标准时间;英语:Greenwich Mean Time,GMT)是指位于英国伦敦郊区的×××格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。