最近要写一些清洗数据的脚本,需要用到各种日期格式,今天来探讨下使用 date
命令的 -d/--date
参数来获取指定时间。
-d/--date
是非常强大且语法很多样复杂的参数,我了解的可能并不全面,想到哪里说到哪,提到的东西只能保证满足日常开发需求。
本文提到的命令都是在 Linux 环境下进行的,Mac 环境需要下载 GNU
相应的命令。
时间戳
将描述转换为 UTC 时间 1970-01-01 以后的时间
1 | $ date -d '@12' |
很明显我们可以用它来做时间戳的格式化
1 | $ date -d '@1560825826' |
然后可以使用 +FORMAT
将时间转为时间戳
1 | $ date -d '2019-06-18 11:36:19' +%s |
时区
服务器一般默认使用的是 UTC 时区
1 | $ date |
返回指定时区格式
1 | $ TZ="Asia/Shanghai" date |
设置指定时间的时区
1 | $ date -d 'TZ="Asia/Shanghai" 2019-06-18 11:13:59' |
世界时区名称列表 List of tz database time zones
datestr
-d/--date
的语法为
1 | $ date -d datestr |
前面我们已经简单领略了他的使用方式,下面详细说说他都支持什么格式。
时间戳
这里注意一定要前面加上 @
符号
1 | $ date -d '@12' |
时间格式
如果不加 @
会怎么样呢,如果传入的数字默认返回当天的指定小时的时间,取值 [0, 23]
1 | $ date -d '12' |
更复杂的格式化按照标准格式 YYYY-mm-dd HH:MM:SS
来指定
1 | $ date -d '2019-06-18 11:58:20' |
1 | $ date -d '11:20' |
咦?似乎这样的设置没什么意义啊,固定的日子和时间,我为什么要多此一举的用 date
在获取一次。确实,它再搭配一点其他的语句就有很大的用处了。
next 关键字
next
关键字可以让上面的命令更有意义
获取明天 9 点的时间
1 | $ date -d '9 next day' |
下周
1 | $ date -d '9 next week' |
下周一
1 | $ date -d '9 next Mon' |
下个月
1 | $ date -d '9 next month' |
如你所见,next
后面跟一个符合常理的时间或缩写就可以获取指定时间以后的某个时间,如果去掉 9
,则返回的是当前时间以后的时间。
下一分钟
1 | $ date -d 'next minute' |
总结下 next
后面跟的参数
second[s]
minute[s]
hour[s]
day[s]
week[s]
month[s]
year[s]
- 星期
Sun[day]
Mon[day]
Tue[sday]
Wed[nesday]
Thu[rsday]
Fri[day]
Sat[urday]
ago 关键字
可以获取之后,就可以获取之前的时间,安装英语的语法应该这样的
一分钟前
1 | $ date -d '1 minute ago' |
09:00
的一分钟前
1 | $ date -d '09:00 minute ago' |
相信不用多举例,你也已经可以明白它的用法了,另外最前面的数字可以为负数,代表的是时间以后。下面两种方式都是获取以后以后的时间
1 | $ date -d '-1 day ago' |
总结下 ago
前可以使用的参数
second[s]
minute[s]
hour[s]
day[s]
week[s]
month[s]
year[s]