Contents

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. yesterdaytomorrow

让我们从获取当前日期前后的一天开始。这非常简单,我们只需使用 -d选项传递yesterdaytomorrow

$ 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. nextagolast

使用*-d选项传递昨天tomorrow*有助于我们获得基准日期前后的一天。

但是,如果我们想获得前后的任意天数怎么办?甚至其他单位,如周、月、年等? nextagolast表达式可以帮助我们:

$ 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*

除了nextlast 等人类可读的日期字符串之外,*我们还可以将带有单位的数字传递给-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"