linux中的date命令
1. 概述
当我们在 Linux 命令行中工作或编写 shell 脚本时,我们经常需要处理日期和时间值,例如以我们需要的格式输出日期、获取相对日期时间或更改系统日期和时间。
在本教程中,我们将仔细研究*date *实用程序并了解其常见用法。
2. date命令介绍
** date命令默认预装在所有 Linux 发行版中,因为它是GNU coreutils 包的一部分。**
使用date命令的语法是:
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
如果我们不提供任何选项,date命令将打印当前系统日期和时间,包括星期几、月份、时间、年份和时区:
$ date
Sat 21 Mar 2020 08:51:23 PM CET
但是,如果我们传递不同的选项,date命令可以做更多的事情。
date命令的一些常见用法是:
-
- 显示给定时区的当前日期和时间
- 以所需格式显示日期和时间
- 显示给定时区的当前日期和时间
- 显示给定字符串的日期和时间
- 获取相对日期和时间
- 设置系统日期和时间
让我们通过一些例子来学习如何处理每一个。
3. 覆盖时区
3.1. 以 UTC 显示日期和时间
date命令 将输出我们系统中定义的时区中的日期和时间。
UTC 是一个特殊的时区。** date命令支持选项*-u*以 UTC 格式显示日期和时间**:
$ date -u
Sat 21 Mar 2020 08:51:03 PM UTC
3.2. 在另一个时区显示日期和时间
date命令 默认使用/etc/localtime 定义的时区。/etc/localtime文件通常是一个符号链接,指向一个时区文件:
$ readlink /etc/localtime
/usr/share/zoneinfo/Europe/Berlin
有时,我们想知道另一个时区的日期和时间。我们可以设置环境变量TZ来覆盖date命令的时区设置:
$ date
Sat 21 Mar 2020 10:07:37 PM CET
$ TZ="EST" date
Sat 21 Mar 2020 04:07:42 PM EST
我们可以为TZ变量分配时区缩写 ,例如上例中的 EST,或时区数据库中的名称 :
$ TZ="Asia/Tokyo" date
Sun 22 Mar 2020 06:07:55 AM JST
更改的环境变量TZ仅适用于以下date命令,系统时区保留原始值:
$ date
Sat 21 Mar 2020 10:09:10 PM CET
4. 以多种格式显示日期和时间
4.1. 以支持的格式显示日期和时间
date命令支持许多显示格式选项。我们可以传递所需的格式到date:
date "+FORMATS"
让我们看几个更改日期格式的示例:
$ date '+Current Date: %F%nCurrent Time: %H:%M:%S'
Current Date: 2020-03-21
Current Time: 22:23:03
$ date '+Today is %A, the %wth day in the week %W.%nUnix timestamp for now: %s'
Today is Saturday, the 6th day in the week 11.
Unix timestamp for now: 1584826306
一些常用的格式是:
- %A – 语言环境的完整工作日名称(例如,Sunday)
- *%D——*日期;与%m/%d/%y相同
- %F——完整日期;喜欢%+4Y-%m-%d
- %s – 自1970-01-01 00:00:00 UTC以来的秒数
- %y – 年份的最后两位数 ( 00..99 )
- %Y – 年份(例如,2020)
- %Z – 字母时区缩写(例如,EST)
- %N – 纳秒
我们可以在手册页或 date –help 的输出中找到支持的格式序列的完整列表。
4.2. 以毫秒为单位显示日期和时间
默认情况下,date命令不支持以毫秒为单位显示日期和时间。但是, date命令支持纳秒格式 %N。例如,我们可以获得当前时间的纳秒数:
$ date +"%N"
696644200
如果我们将纳秒四舍五入到前三位数字,我们将得到毫秒:
$ date +"%3N"
658
我们可以将 *“%3N”*格式与其他格式结合起来显示一个以毫秒为单位的日期和时间。 让我们获取自 1970-01-01 00:00:00 UTC 以来的毫秒数:
$ date +"%s%3N"
1601496351755
我们还可以以毫秒为单位显示当前日期和时间:
$ date +"%F %T.%3N"
2020-09-30 22:07:30.450
5. 显示给定字符串的日期
我们可以将静态日期或时间字符串值与-d选项一起传递给date*命令,并让它以我们需要的格式解析和打印日期和时间。*
例如,我们可以通过几种方式将日期字符串传递给date命令以指示 18 Nov 1976 18:18:18:
$ date -d'1976-11-18 18:18:18'
Thu 18 Nov 1976 06:18:18 PM CET
$ date -d'11/18/1976 18:18:18'
Thu 18 Nov 1976 06:18:18 PM CET
$ date -d'18 Nov 1976 18:18:18'
Thu 18 Nov 1976 06:18:18 PM CET
$ date -d'19761118T18:18:18'
Thu 18 Nov 1976 06:18:18 PM CET
$ date -d'@217185498'
Thu 18 Nov 1976 06:18:18 PM CET
从上面的示例中,我们看到date 命令支持的日期字符串模式 非常灵活。它可以是*@*之后的 Unix 时间戳、ISO 日期格式,甚至是人类可读的日期字符串。
6. 获取相对日期和时间
在上一节中,我们已经了解了*-d选项的日期字符串的灵活性 。在本节中,我们将继续使用-d’dateString’让date*命令计算过去或未来的相对日期和时间。
在本节中,所有相对日期计算的示例都将基于当前日期和时间:
$ date
Sun 22 Mar 2020 11:27:41 PM CET
6.1. yesterday和tomorrow
让我们从获取当前日期前后的一天开始。这非常简单,我们只需使用 -d选项传递yesterday和tomorrow:
$ date -d'yesterday'
Sat 21 Mar 2020 11:30:32 PM CET
$ date -d'tomorrow'
Mon 23 Mar 2020 11:30:37 PM CET
6.2. next,ago和last
使用*-d选项传递昨天或tomorrow*有助于我们获得基准日期前后的一天。
但是,如果我们想获得前后的任意天数怎么办?甚至其他单位,如周、月、年等? next、ago和last表达式可以帮助我们:
$ date -d'3 days ago'
Thu 19 Mar 2020 11:40:14 PM CET
$ date -d'next 2 month'
Thu 23 May 2020 12:40:23 AM CET
$ date -d'last week'
Sun 15 Mar 2020 11:40:29 PM CET
$ date -d'next wed'
Wed 25 Mar 2020 12:00:00 AM CET
$ date -d'last Sunday'
Sun 15 Mar 2020 12:00:00 AM CET
6.3. +x和*-x*
除了next和last 等人类可读的日期字符串之外,*我们还可以将带有单位的数字传递给-d*选项。**正数将获得未来的日期时间,而负数表示过去的日期时间:
$ date -d'+7 day'
Mon 30 Mar 2020 12:54:43 AM CET
$ date -d'-3 year'
Wed 22 Mar 2017 11:54:51 PM CET
$ date -d'10 week'
Mon 01 Jun 2020 12:55:08 AM CET
这种方式使得以编程方式计算相对日期时间变得容易,例如,在 shell 脚本中。
6.4. 根据给定日期获取相对日期和时间
到目前为止,我们已经看到了一些根据当前日期时间获取相对日期和时间的示例。它们也适用于给定的日期字符串。 让我们看一些基于 1976-11-18 获取相对日期时间的示例:
$ date -d'19761118 -3 days'
Mon 15 Nov 1976 12:00:00 AM CET
$ date -d'19761118 last year'
Tue 18 Nov 1975 12:00:00 AM CET
$ date -d'19761118 tomorrow'
Fri 19 Nov 1976 12:00:00 AM CET
$ date -d'19761118 2 month ago'
Sat 18 Sep 1976 12:00:00 AM CET
7. 更改系统时间
我们可以使用 带*-s* 选项的date命令来手动更改系统时钟。由于更改系统时间会影响当前正在运行的程序,因此只允许root用户进行更改。
例如,下一条命令会将我们的系统时间设置为1976-11-18 18:18:18:
root# date -s "1976-11-18 18:18:18"