Mac下的date命令是BSD系的, Linux下date命令是GNU系的,两者的用法有一些区别,罗列如下:

共同点

基本的时间格式的缩写是相同的,规则如下:

  • %Y 表示四位数形式的年份, 比如2017
  • %m 表示带前导0的月份,比如02,12
  • %d 表示带前导0的日子, 比如 02,28
  • %H 表示带前导0的24小时, 比如 01, 23
  • %M 表示带前导0的分钟数, 比如 05, 22
  • %S 表示带前导0的秒数, 比如 06,45
  • %s 表示距离格林威治时间(1970年1月1日0点)的秒数

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Macos
$ date
2017年 8月 4日 星期五 14时31分00秒 CST
$ date +%Y%m%d%H%M%S
20170804143107
$ date +%Y%m%d%H%M%S
20170804143112
$
# Linux(Centos)
$ date
2017年 08月 04日 星期五 06:31:33 UTC
$ date +%Y%m%d%H%M%S
20170804063135
$ date +%s
1501828299
$

不同点

获取前一天和获取后一天的写法不同

Macos 下通过使用-v参数时间,-v-1d代表前一天, -v-1y代表上一年
Linux 下通过--date参数实现, --date='-1 day'代表前一天, --date='-1 year'代表上一年

1
2
3
4
5
6
7
8
9
10
11
# Macos
$ date -v-1d -v-1y +%Y-%m-%d
2016-08-03
$
# Linux
$ date +%Y-%m-%d --date='-1 day -1 year'
2016-08-03
$

检查平台来决定如何使用date

可以使用uname -s的输出来判定是哪个平台,Linux下命令输出是Linux, Macos下命令输出是Darwin.

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
os=$(uname -s)
if [[ "$os" == "Linux" ]]; then
date +%Y-%m-%d --date='-1 day -1 year'
elif [[ "$os" == "Darwin" ]]; then
date -v-1d -v-1y +%Y-%m-%d
else
echo "unknown OS"
exit 1
fi

留言