Linux命令 date


原文链接: Linux命令 date

CST=UTC+8=GMT+8
CST:中国标准时间(China Standard Time) 等价于
UTC:世界标准时间(Universal Time/Temps Cordonn&eacute) + 8
GMT:格林尼治标准时间(Greenwich Mean Time) 等于UTC时间
PST是太平洋标准时间(西八区),与北京时间(东八区)时差-16个小时,也就是北京时间减去16就是PST时间。而PDT比PST早1个小时,就是说PDT与北京时间时差为-15小时

date "+%F %T" > /mnt/sd/time
1970-01-02 13:21:32

date -s "$(cat /mnt/sd/time)"

linux 时间显示规则

linux 系统运行的时间是依赖UTC时间的,显示出来的时间是依据/etc/localtime的时区设置。

// 1. /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai 保证本地时间是CST时间
// 2. hwclock -u -w rtc时钟存储的为utc时间,比local时间小8小时。
// 3. Linux系统重启后从rtc中恢复的是UTC时间,根据/etc/localtime 决定显示的时间是UTC时间还是CST时间。

时间转换

  1. 获取现在的Unix时间戳(Unix timestamp)
    date +%s
    1540956924

  2. 普通时间 → Unix时间戳(Unix timestamp)
    date +%s -d"Jan 1, 1970 00:00:00 utc"
    0
    date +%s -d"Jan 1, 1970 00:00:00 cst"
    -28800

  3. Unix时间戳(Unix timestamp) → 普通时间
    Convert seconds since the epoch (1970-01-01 UTC) to a date
    $ date --date='@2147483647'
    date -d @2147483647
    Tue Jan 19 11:14:07 CST 2038

输出UTC时间

date --iso-8601=s -u
2017-09-27T10:19:07+00:00

date -I 等价 date --iso-8601=date

date --iso-8601=second等价 date +%F %T%z
2017-09-27T18:01:25+08:00

date --rfc-3339=s
2017-09-27 18:01:40+08:00

date --rfc-2822
Wed, 27 Sep 2017 18:01:55 +0800

  ANSIC       = "Mon Jan _2 15:04:05 2006"
   UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
   RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
   RFC822      = "02 Jan 06 15:04 MST"
   RFC822Z     = "02 Jan 06 15:04 -0700" // 使用数字表示时区的RFC822
   RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
   RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
   RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // 使用数字表示时区的RFC1123
   RFC3339     = "2006-01-02T15:04:05Z07:00"
   RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
   Kitchen     = "3:04PM"
   // 方便的时间戳
   Stamp      = "Jan _2 15:04:05"
   StampMilli = "Jan _2 15:04:05.000"
   StampMicro = "Jan _2 15:04:05.000000"
   StampNano  = "Jan _2 15:04:05.000000000"

TIME_START="$(date +%s)" 1509691531 #现实unix时间戳
DOWEEK="$(date +'%u')" 5 #显示星期
HOSTNAME="$(hostname)"

设置时间

date -s //设置当前时间,只有root权限才能设置,其他只能查看。
date -s 20061010 //设置成20061010,这样会把具体时间设置成空00:00:00
date -s 12:23:23 //设置具体时间,不会对日期做更改
date -s "12:12:23 2006-10-10" //这样可以设置全部时间

获取指定时间加减

date +%Y%m%d //显示现在天年月日
date +%Y%m%d --date="+1 day" //显示后一天的日期
date +%Y%m%d --date="-1 day" //显示前一天的日期
date +%Y%m%d --date="-1 month"//显示上一月的日期
date +%Y%m%d --date="+1 month"//显示下一月的日期
date +%Y%m%d --date="-1 year" //显示前一年的日期
date +%Y%m%d --date="+1 year" //显示下一年的日期
date -d yesterday +%Y%m%d # 昨天
date -d tomorrow +%Y%m%d # 明天
date -d next-day +%Y%m%d # 明天
date -d last-day +%Y%m%d # 昨天
date -d last-month +%Y%m
date -d next-month +%Y%m 200604
date -d next-year +%Y 2007

打印当前时间

%F full date; %Y-%m-%d
%T time; %H:%M:%S

date "+%Y%m%d_%H%M" 20170102_1145

date "+%Y-%m-%d %H:%M:%S" [2016-01-06 16:46:14]

(date +'%Y-%m-%d %H:%M')" # 2016-06-25 23:59
date "+%Y-%m-%d" 2013-02-19
date "+%H:%M:%S" 13:13:59
date "+%Y-%m-%d %H:%M:%S" 2013-02-19 13:14:19
date "+%Y%m%d %H:%M:%S" 2013_02_19 13:14:58

%H 小时(以00-23来表示)。
%I 小时(以01-12来表示)。
%K 小时(以0-23来表示)。
%l 小时(以0-12来表示)。
%M 分钟(以00-59来表示)。
%P AM或PM。
%r 时间(含时分秒,小时以12小时AM/PM来表示)。
%s 总秒数。起算时间为1970-01-01 00:00:00 UTC。
%S 秒(以本地的惯用法来表示)。
%T 时间(含时分秒,小时以24小时制来表示)。 %H:%M:%S
%X 时间(以本地的惯用法来表示)。
%Z 市区。
%a 星期的缩写。
%A 星期的完整名称。
%b 月份英文名的缩写。
%B 月份的完整英文名称。
%c 日期与时间。只输入date指令也会显示同样的结果。
%d 日期(以01-31来表示)。
%D 日期(含年月日)。
%j 该年中的第几天。
%m 月份(以01-12来表示)。
%U 该年中的周数。
%w 该周的天数,0代表周日,1代表周一,异词类推。
%x 日期(以本地的惯用法来表示)。
%y 年份(以00-99来表示)。
%Y 年份(以四位数来表示)。
%n 在显示时,插入新的一行。
%t 在显示时,插入tab。
MM 月份(必要)
DD 日期(必要)
hh 小时(必要)
mm 分钟(必要)
ss 秒(选择性)
选择参数:
-d<字符串>  显示字符串所指的日期与时间。字符串前后必须加上双引号。
-s<字符串>  根据字符串来设置日期与时间。字符串前后必须加上双引号。
-u  显示GMT。

设置系统时间

ansible all -a "timedatectl set-ntp true" # 开启时间同步
ansible all -a "timedatectl set-timezone Asia/Shanghai"
ansible all -a "hwclock --systohc --utc"

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ntpdate time.pool.aliyun.com

`