标签 时间 下的文章

这篇关于 MySQL 中日期和时间的概述将帮助你在数据库表中处理时间值。

流行数据库系统 MySQL 的新老用户常常会对数据库处理时间值的方式感到困惑。有时用户不会费心去了解时间值的数据类型。这可能是因为他们觉得本身也没有什么好了解的。日期就是日期,对吧?好吧,并非总是如此。花几分钟时间了解 MySQL 如何存储和显示日期和时间是有益的。学习如何最好地利用数据库表中的时间值可以帮助你成为更好的编码者。

MySQL 时间值类型

当你在 MySQL 中新建表时,选择合适的数据类型(INTFLOATCHAR 等)高效地保存插入到表中的数据。MySQL 为时间值提供了五种数据类型。它们是 DATETIMEDATETIMETIMESTAMPYEAR

MySQL 使用 ISO 8601 格式来存储以下格式的值(LCTT 译注:国际标准 ISO 8601,是国际标准化组织的日期和时间的表示方法,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》):

  • DATEYYYY-MM-DD
  • TIMEHH:MM:SS
  • TIMESTAMPYYYY-MM-DD HH:MM:SS
  • YEARYYYY

DATETIME 与 TIMESTAMP 的比较

你可能已经注意到 日期时间 DATETIME 时间戳 TIMESTAMP 数据类型存有相同的数据。你可能想知道这两者之间是否有差异。答案是:有。

首先,可以使用的日期范围不同。DATETIME 可以保存 1000-01-01 00:00:00 和 9999-12-31 23:59:59 之间的日期,而 TIMESTAMP 的范围更有限,从 1970-01-01 00:00:01 到 2038-01-19 03:14:07 UTC。

其次,虽然两种数据类型都允许你 自动初始化 auto_initialize 自动更新 auto_update 它们各自的值(分别用 DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP),但在 5.6.5 版本之前,对 DATETIME 值不能这样操作。如果你要用 DATETIME,你可以使用 CURRENT_TIMESTAMP 的 MySQL 同义词之一,例如 NOW()LOCALTIME()

如果你对一个 DATETIME 值使用 ON UPDATE CURENT_TIMESTAMP(或其同义词之一),但没有使用 DEFAULT CURRENT_TIMESTAMP 子句,那么这个列的默认值为 NULL。除非你在表的定义中包含 NOT NULL,在这种情况下,它默认为 0。

另一件需要记住的重要事情是,尽管通常情况下,除非你声明一个默认值,否则 DATETIMETIMESTAMP 列都没有一个默认值,但这个规则有一个例外。如果没有指定 DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP 这两个子句,并且禁用 explicit_defaults_for_timestamp 这个变量,那么你表中的第一个 TIMESTAMP 列将被隐式创建。

要检查这个变量的状态,请运行:

mysql> show variables like 'explicit_default%';

如果你想打开或关闭它,运行这段代码(用 0 表示关闭,用 1 表示打开):

mysql> set explicit_defaults_for_timestamp = 0;

TIME

MySQL 的 时间 TIME 数据类型可能看起来很简单,但有几件事是一个优秀的程序员应该牢记的。

首先要注意的是,虽然 TIME 经常被认为是一天中的时间,但它实际上是经过的时间。换句话说,它可以是一个负值,或者可以大于 23:59:59。在 MySQL 中,一个 TIME 值的范围可以是 -838:59:59 到 838:59:59。

另外,如果你缩写一个时间值,MySQL 会因你是否使用冒号作出不同解释。例如,10:34 这个值被 MySQL 看作是 10:34:00。也就是说,十点过后的 34 分钟。但是,如果你不使用冒号写作 1034,MySQL 将其视为 00:10:34,意思是 10 分钟 34 秒。

最后,你应该知道 TIME 值(以及 DATETIMETIMESTAMP 字段的时间部分)从 5.6.4 版本开始,可以取一个小数部分。要使用它,请在数据类型定义的结尾处添加一个整数(最大值为 6)的圆括号。

time_column TIME(2)

时区

时区变化不仅在现实世界中产生混乱和疲劳,而且也会在数据库系统中制造麻烦。地球被划分为 24 个独立的时区,通常每隔 15 度经度就会发生变化。我说通常是因为一些国家行事方式不同。例如中国只在一个时区运作,而不是预期的五个时区。

你如何处理处于不同时区的数据库系统的用户就成了一个问题。幸运的是,MySQL 并没有使这个问题变得太困难。

要检查你的会话时区,请运行:

mysql> select @@session.time_zone;

如果结果显示 System,这意味着它正在使用你的 my.cnf 配置文件中设置的时区。如果你在本地计算机上运行你的 MySQL 服务器,这可能就是你会得到的,你不需要做任何改变。

如果你想改变你的会话的时区,请运行如下命令:

mysql> set time_zone = '-05:00';

这将你的时区设置为 美国/东部 US/Eastern ,比 协调世界时 UTC 晚五个小时。

获得一周的日期

为了跟上本教程后面部分的代码,你应该在你的系统中创建一个带有日期值类型的表。比如:

mysql> create table test
( row_id smallint not null auto_increment primary key,
the_date date not null);

然后使用 ISO 8601 格式在表中插入一些随机日期,如

mysql> insert into test (the_date) VALUES ('2022-01-05');

我在我的 test 表中插入了四行日期值,你插入多少行都可以。

有时你可能想知道某一天是星期几。MySQL 给了你几种实现方法。

第一种,也是最显而易见的方法,是使用 DAYNAME() 函数。如下示例表所展示,DAYNAME() 函数可以告诉你每个日期是星期几:

mysql> SELECT the_date, DAYNAME(the_date) FROM test;
+------------+-------------------------------+
| the_date   | DAYNAME(the_date)             |
+------------+-------------------------------+
| 2021-11-02 | Tuesday                       |
| 2022-01-05 | Wednesday                     |
| 2022-05-03 | Tuesday                       |
| 2023-01-13 | Friday                        |
+------------+-------------------------------+
4 rows in set (0.00 sec)

另外两种获取星期几的方法是返回整数值,而不是星期几的名称,分别是 WEEKDAY()DAYOFWEEK()。他们都返回数字,却又各不相同。WEEKDAY() 函数返回从 0 到 6 的数字,其中 0 代表星期一,6 代表星期日。而 DAYOFWEEK() 则返回从 1 到 7 的数字,其中 1 代表星期日,7 代表星期六。

mysql> SELECT the_date, DAYNAME(the_date),
WEEKDAY(the_date), DAYOFWEEK(the_date) FROM test;
+------------+------------------+------------------+--------------------+
| the_date   | DAYNAME(the_date)| WEEKDAY(the_date)| DAYOFWEEK(the_date)|
| 2021-11-02 | Tuesday          | 1                | 3                  |
| 2022-01-05 | Wednesday        | 2                | 4                  |
| 2022-05-03 | Tuesday          | 1                | 3                  |
| 2023-01-13 | Friday           | 4                | 6                  |
+------------+------------------+------------------+--------------------+
4 rows in set (0.00 sec)

当你只想获取日期的一部分时

有时你可能在 MySQL 表中存储了一个日期,但是你只想获取日期的一部分。这并不是问题。

MySQL 中有几个顾名思义的函数,可以轻松获取日期对象的特定部分。以下是一些示例:

mysql> SELECT the_date, YEAR(the_date), MONTHNAME(the_date), 
DAYOFMONTH(the_date) FROM test ;
+-----------+---------------+-------------------+---------------------+
| the_date  | YEAR(the_date)|MONTHNAME(the_date)| DAYOFMONTH(the_date)|
+-----------+---------------+-------------------+---------------------+
| 2021-11-02| 2021          | November          | 2                   |
| 2022-01-05| 2022          | January           | 5                   |
| 2022-05-03| 2022          | May               | 3                   |
| 2023-01-13| 2023          | January           | 13                  |
+-----------+---------------+-------------------+---------------------+
4 rows in set (0.00 sec)

MySQL 也允许你使用 EXTRACT() 函数来获取日期的一部分。你提供给函数的参数是一个单位说明符(确保是单数形式)、FROM 和列名。因此,为了从我们的 test 表中仅获取年份,你可以写:

mysql> SELECT EXTRACT(YEAR FROM the_date) FROM test;
+----------------------------------------------+
| EXTRACT(YEAR FROM the_date)                  |
+----------------------------------------------+
| 2021                                         |
| 2022                                         |
| 2022                                         |
| 2023                                         |
+----------------------------------------------+
4 rows in set (0.01 sec)

插入和读取不同格式的日期

正如之前提到的,MySQL 使用 ISO 8601 格式存储日期和时间值。但是如果你想以另一种方式存储日期和时间值,例如 MM-DD-YYYY 格式,怎么办?首先,不要尝试这样做。MySQL 以 8601 格式存储日期和时间,就是这样。不要尝试更改它。但是,这并不意味着你必须在将数据输入到数据库之前将数据转换为特定的格式,或者你不能以任何你想要的格式展示数据。

如果你想要将非 ISO 的格式的日期输入到表中,你可以使用 STR_TO_DATE() 函数。第一个参数是你想要存储在数据库中的日期的字符串值。第二个参数是格式化字符串,它让 MySQL 知道日期的组织方式。让我们看一个简单的例子,然后我将更深入地研究这个看起来很奇怪的格式化字符串是什么。

mysql> insert into test (the_date) values (str_to_date('January 13, 2023','%M %d, %Y'));

Query OK, 1 row affected (0.00 sec)

你将格式化字符串放在引号中,并在每个特殊字符前加上百分号。上面代码中的格式序列告诉 MySQL 我的日期由一个完整的月份名称 %M,后跟一个两位数的日期%d,然后是一个逗号,最后由一个四位数的年份 %Y 组成。请注意,大写很重要。

一些其他常用的格式化字符串字符是:

  • %b 缩写月份的名称(例如: Jan
  • %c 数字月份(例如: 1)
  • %W 星期名称(例如: `Saturday)
  • %a 星期名称的缩写(例如: Sat
  • %T 24 小时制的时间(例如: 22:01:22
  • %r 带 AM/PM 的 12 小时制的时间(例如: 10:01:22 PM
  • %y 两位数的年份(例如: 23)

请注意,对于两位数年份 %y,年份范围是 1970 到 2069。因此,从 70 到 99 的数字被假定为 20 世纪,而从 00 到 69 的数字被假定为 21 世纪。

如果你有一个日期存储在你的数据库中,你想用不同的格式显示它,你可以使用这个 DATE_FORMAT() 函数:

mysql> SELECT DATE_FORMAT(the_date, '%W, %b. %d, %y') FROM test;
+-----------------------------------------+
| DATE_FORMAT(the_date, '%W, %b. %d, %y') |
+-----------------------------------------+
| Tuesday, Nov. 02, 21                    |
| Wednesday, Jan. 05, 22                  |
| Tuesday, May. 03, 22                    |
| Friday, Jan. 13, 23                     |
+-----------------------------------------+
4 rows in set (0.00 sec)

总结

本教程应该为你提供了一个关于 MySQL 中的日期和时间值的有用的概述。我希望本文教会了您一些新知识,使您能够更好地控制和理解 MySQL 数据库如何处理时间值。

(题图:MJ/76b6481a-a271-4e81-bc17-dd7fbe08a240)


via: https://opensource.com/article/23/2/temporal-values-mysql

作者:Hunter Coleman 选题:lkxed 译者:hanszhao80 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你 双启动 Windows 和 Ubuntu 或任何其他 Linux 发行版,你可能会注意到两个操作系统之间的时间差异。

当你 使用 Linux 时,它会显示正确的时间。但当你进入 Windows 时,它显示的时间是错误的。有时,情况正好相反,Linux 显示的是错误的时间,而 Windows 的时间是正确的。

特别奇怪的是,因为你已连接到互联网,并且已将日期和时间设置为自动使用。

别担心!你并不是唯一一个遇到这种问题的人。你可以在 Linux 终端上使用以下命令来解决这个问题:

timedatectl set-local-rtc 1

同样,不要担心。我会解释为什么你在双启动设置中会遇到时间差。我会向你展示上面的命令是如何修复 Windows 双启动后的时间错误问题的。

为什么 Windows 和 Linux 在双启动时显示不同的时间?

一台电脑有两个主要时钟:系统时钟和硬件时钟。

硬件时钟也叫 RTC(实时时钟)或 CMOS/BIOS 时钟。这个时钟在操作系统之外,在电脑的主板上。即使在你的系统关机后,它也会继续运行。

系统时钟是你在操作系统内看到的。

当计算机开机时,硬件时钟被读取并用于设置系统时钟。之后,系统时钟被用于跟踪时间。如果你的操作系统对系统时钟做了任何改变,比如改变时区等,它就会尝试将这些信息同步到硬件时钟上。

默认情况下,Linux 认为硬件时钟中存储的时间是 UTC,而不是本地时间。另一方面,Windows 认为硬件时钟上存储的时间是本地时间。这就是问题的开始。

让我用例子来解释一下。

你看我在加尔各答 UTC+5:30 时区。安装后,当我把 Ubuntu 中的时区 设置为加尔各答时区时,Ubuntu 会把这个时间信息同步到硬件时钟上,但会有 5:30 的偏移,因为对于 Linux 来说它必须是 UTC。

假设加尔各答时区的当前时间是 15:00,这意味着 UTC 时间是 09:30。

现在当我关闭系统并启动到 Windows 时,硬件时钟有 UTC 时间(本例中为 09:30)。但是 Windows 认为硬件时钟已经存储了本地时间。因此,它改变了系统时钟(应该显示为 15:00),而使用 UTC 时间(09:30)作为本地时间。因此,Windows 显示时间为 09:30,这比实际时间(我们的例子中为 15:00)早了 5:30。

同样,如果我在 Windows 中通过自动时区和时间按钮来设置正确的时间,你知道会发生什么吗?现在它将在系统上显示正确的时间(15:00),并将此信息(注意图片中的“同步你的时钟”选项)同步到硬件时钟。

如果你启动到 Linux,它会从硬件时钟读取时间,而硬件时钟是当地时间(15:00),但由于 Linux 认为它是 UTC 时间,所以它在系统时钟上增加了 5:30 的偏移。现在 Linux 显示的时间是 20:30,比实际时间超出晚了 5:30。

现在你了解了双启动中时差问题的根本原因,是时候看看如何解决这个问题了。

修复 Windows 在 Linux 双启动设置中显示错误时间的问题

有两种方法可以处理这个问题:

  • 让 Windows 将硬件时钟作为 UTC 时间
  • 让 Linux 将硬件时钟作为本地时间

在 Linux 中进行修改是比较容易的,因此我推荐使用第二种方法。

现在 Ubuntu 和大多数其他 Linux 发行版都使用 systemd,因此你可以使用 timedatectl 命令来更改设置。

你要做的是告诉你的 Linux 系统将硬件时钟(RTC)作为本地时间。你可以通过 set-local-rtc (为 RTC 设置本地时间)选项来实现:

timedatectl set-local-rtc 1

如下图所示,RTC 现在使用本地时间。

现在如果你启动 Windows,它把硬件时钟当作本地时间,而这个时间实际上是正确的。当你在 Linux 中启动时,你的 Linux 系统知道硬件时钟使用的是本地时间,而不是 UTC。因此,它不会尝试添加这个时间的偏移。

这就解决了 Linux 和 Windows 双启动时的时差问题。

你会看到一个关于 RTC 不使用本地时间的警告。对于桌面设置,它不应该引起任何问题。至少,我想不出有什么问题。

希望我把事情给你讲清楚了。如果你还有问题,请在下面留言。


via: https://itsfoss.com/wrong-time-dual-boot/

作者:Abhishek Prakash 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Equinix 推出“时间即服务”

许多行业和云服务都依赖于精确、可靠和安全的时间同步。传统的、基于天线的 GPS 授时基础设施解决方案可能难以安装,并会带来安全漏洞。同时,从互联网上利用公开 NTP 服务器授时也有网络安全风险。

数字基础设施公司 Equinix 正在推出的 Precision Time 服务旨在解决这个挑战。Equinix 管理和维护一个由 GPS 天线、带有原子钟保持器的时间服务器及主时钟组成的冗余堆栈。新服务支持 NTP 和 PTP 等网络授时协议。该服务提供 50 微秒的 SLA,要比大多数时间同步精度要求高得多。

连时间都能成为服务,听起来有趣,但是其实有一定的必要性。

2020 年三分之二的 Google 搜索没有带来进一步点击

2019 年的一项研究发现,50.33% 的 Google 搜索没有导致外链点击。2020 年这一比例进一步提高到三分之二左右。这一数据来自 SimilarWeb 对 2020 年 51 万亿次 Google 搜索的分析。在这些搜索中,33.59% 点击了搜索结果,1.59% 点击了付费搜索结果,其余 64.82% 则是零点击。

看来通用搜索引擎的有效性越来越差了,难怪现在有很多垂直搜索引擎出现。

Canonical 将谷歌的 Flutter 视为未来桌面和移动应用的默认选择

Flutter 是一个使用 Dart 语言的框架,可以开发跨 Android、iOS、Windows、Linux、macOS 和 Web 的应用,不过 macOS 和 Linux 版本尚处于测试阶段。尽管如此,为了扩大 Linux 应用生态系统,Ubuntu 的开发商 Canonical 上个月还是宣布将用 Flutter 构建新的桌面安装程序,并向开发者表示“Flutter 是 Canonical 未来创建的桌面和移动应用的默认选择”。

Flutter 的性能比 Electron 等替代品更好,虽然它的性能不如原生开发平台,但它跨操作系统开发的能力超过了这种差异。跨平台开发不仅仅意味着 Linux 开发者可以为其他平台编写应用,还意味着任何其他平台的 Flutter 开发者都可以将他们的应用贡献给 Linux,从而扩大 Linux 应用生态系统。

这是一个看起来不错的选择,但是 Flutter 并不是第一个以跨平台为主要卖点的框架,而之前的类似框架并未真正给 Linux 带来多少重要应用,所以将来的发展需要拭目以待。

UNIX 时间突破 16 亿秒

UNIX 时间(Epoch time)是 UNIX 系统使用的时间表示方式,从协调世界时 1970 年 1 月 1 日 0 时 0 分 0 秒起开始计算,它不考虑闰秒,因此并不是协调世界时的真实表达。UNIX 时间每天固定为 86400 秒,每年 31556926 秒,到 2020 年 9 月 13 日晚上 8 点 26 分(GMT+8),它的总秒数突破了 16 亿。

来源:solidot

拍一拍:时间不停流逝,下次千年虫也在慢慢接近。

卡巴斯基警告说,入侵者越来越针对 Linux

虽然在大规模恶意软件攻击中,Windows 往往更经常成为攻击目标,但当涉及到高级持续性威胁(APT)时,情况并非总是如此。许多组织都会选择 Linux 作为战略上重要的服务器和系统,而随着大企业以及政府机构使用 Linux 作为桌面环境,攻击者又在为该平台开发更多的恶意软件。根据卡巴斯基的数据,已经观察到有十多个 APT 行为者使用 Linux 恶意软件或一些基于 Linux 的模块。

来源:slashdot

拍一拍:所以,一个操作系统安全不安全,全看是不是主流了。

Manjaro 20.1 Mikah 提供了 Xfce/GNOME/KDE 三种风味

继 4 月推出的 Manjaro 20 “Lysia”之后,Linux 社区又迎来了该系列的首个更新 —— Manjaro 20.1 “Mikah”。还提供了三种风味,感兴趣的朋友可选下载 Xfce(4.14)、GNOME(3.36)和 KDE Plasma(5.19)三种桌面环境。

来源:cnbeta

拍一拍:Manjaro 赢得了一致好评。

ActivityWatch 是一款开源的隐私友好型应用程序,可追踪你在台式电脑或移动设备上的使用时间。

ActivityWatch: 一个追踪你在哪个应用程序上花了多少时间的开源应用程序

ActivityWatch 是一款跨平台的开源应用,可以帮助你追踪使用时间,衡量你的工作效率。它可以追踪你花在应用程序、浏览器上的时间,以及你是否 AFK(远离键盘)或系统处于休眠状态。

不只是追踪时间,它还提供了一堆有用的功能,通过可视化的方式帮助你轻松分析你是如何花费时间的,从而有可能提高你的生产力。

它是 RescueTimeManicTime 等专有产品的绝佳替代品。

ActivityWatch 可用于 Linux、Windows、macOS 和 Android。它还提供了 Chrome 和 Firefox 的浏览器扩展。截至目前,App Store 上还没有它的 iOS 版应用。

它刚刚进入该领域,正在积极开发,以解决任何现有的问题并引入新的功能,如在多个设备上同步你的活动数据的能力。

对于注重隐私的用户来说,我应该提到,收集的数据被存储在你本地的设备上。这是一件好事,因为你可以跟踪你的花费时间,而不会被别人跟踪。

ActivityWatch 的功能

基本上,ActivityWatch 可以让你监控你的活动,以分析不良的屏幕使用时间,或改善你在设备上工作的时间管理。

具体来说,它提供了几个有用的功能,主要有:

  • 摘要你的日常活动及按使用时间排序的应用和程序列表。
  • 追踪你的浏览器活动的时间,使用浏览器扩展来获得每个活动标签所花费时间的确切数据。
  • 追踪 AFK 和非 AFK 时间。(AFK - “Away From Keyboard” 的缩写,即不在电脑前)
  • 提供不同的可视化时间线,以监测你的活动。
  • 能够使用 watchers 跟踪你在编辑器上写代码的时间。
  • 记录你的活动,以分析你的生产力。
  • 将花费的时间进行分类,可以帮助你详细分析。
  • 可以添加更多的类别和调整时间轴的持续时长。
  • 能够将数据导出/导入为 JSON 文件。
  • 实验性的秒表功能。
  • 本地存储数据,以尊重用户隐私。

在 Linux 上安装 ActivityWatch

注:如果你的 Linux 发行版不支持系统托盘图标,你需要遵循这个文档来解决这个问题。

不幸的是,你找不到 AppImage、Flatpak 或 Snap 软件包。然而,对于 Manjaro 或 Arch Linux 有可以安装的 AUR 包。

对于所有其它的 Linux 发行版,你会得到一个 ZIP 文件,其中包括一个要运行的 aw-qt 应用程序。

要运行它,你需要解压 zip 归档文件,然后通过双击 aw-qt 应用程序运行二进制文件来安装它。

你也可以使用终端:

`cd activitywatch-v0.9.2-linux-x86_64
sudo ./aw-qt`

解压文件夹的位置和文件名可能会有所不同 —— 所以请确保你导航到正确的目录,然后使用上面的命令。完成后,你可以从系统托盘图标访问 ActivityWatch,或者直接前往 localhost:5600 访问它。

你也可以查看他们的 GitHub 页面官方网站来探索更多关于它的信息。

顺便提一句,如果你计划经常使用 ActivityWatch,你应该将下载的文件移动到 /opt 目录下,并在 /usr/share/bin 目录下创建一个链接到 aw-qt 可执行文件符号链接。这样一来,该应用程序可以作为一个常规命令供系统上的所有用户使用。类似的方法在 PopcornTime 安装教程中也有演示。

我对 ActivityWatch 的看法

Pop!\_OS 20.04 上,时间跟踪功能可以完全正常地工作,也支持系统托盘图标。你可能会遇到一个错误,不能让你从系统托盘图标访问 ActivityWatch(这也是一个 GitHub 上的已知问题)。在这种情况下,你需要通过 localhost:5600 来访问它。

就个人而言,考虑到我在桌面上使用它,并且没有计划在智能手机上使用它,我对提供的功能相当满意。

我必须得向你推荐尝试这个不错的开源项目,并一路支持他们。如果你喜欢这个项目,请随时通过添加星标或赞助他们的 GitHub 仓库来表示你的赞赏。

欢迎在下面的评论中告诉我你的想法。


via: https://itsfoss.com/activitywatch/

作者:Ankush Das 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux 的 date 命令提供了很多显示日期和时间的选项,要比你想的还要多。这是一些有用的选择。

在 Linux 系统上,date 命令非常简单。你键入 date,日期和时间将以一种有用的方式显示。它包括星期几、日期、时间和时区:

$ date
Tue 26 Nov 2019 11:45:11 AM EST

只要你的系统配置正确,你就会看到日期和当前时间以及时区。

但是,该命令还提供了许多选项来以不同方式显示日期和时间信息。例如,如果要显示日期以便进行排序,则可能需要使用如下命令:

$ date "+%Y-%m-%d"
2019-11-26

在这种情况下,年、月和日按该顺序排列。请注意,我们使用大写字母 Y 来获得四位数的年份。如果我们使用小写的 y,则只会看到两位数字的年份(例如 19)。不要让这种做法使你错误地联想到如果 %m 给你一个数字月份,%M 可能会给你月份的名称。不,%M 将给你分钟数。要以缩写名称格式获得月份,你要使用 %b,而对于完全拼写的月份,则要使用 %B

$ date "+%b %B"
Nov November

或者,你可能希望以这种常用格式显示日期:

$ date "+%D"
11/26/19

如果你需要四位数的年份,则可以执行以下操作:

$ date "+%x"
11/26/2019

下面是一个可能有用的示例。假设你需要创建一个每日报告并在文件名中包含日期,则可以使用以下命令来创建文件(可能用在脚本中):

$ touch Report-`date "+%Y-%m-%d"`

当你列出你的报告时,它们将按日期顺序或反向日期顺序(如果你添加 -r)列出。

$ ls -r Report*
Report-2019-11-26
Report-2019-11-25
Report-2019-11-22
Report-2019-11-21
Report-2019-11-20

你还可以在日期字符串中添加其他详细信息。可用的各种选项多得令人惊讶。你可以使用 date "+%q" 来显示你所在的一年中的哪个季度,或使用类似以下命令来显示两个月前的日期:

$ date --date="2 months ago"
Thu 26 Sep 2019 09:02:43 AM EDT

是否想知道下周四的日期?你可以使用类似 date --date="next thu" 的命令,但是要理解,对于Linux,下个周四意味着今天之后的周四。如果今天是星期三,那就是明天,而不是下周的星期四。但是,你可以像下面的第二个命令一样指定下周的星期四。

$ date --date="next thu"
Thu 28 Nov 2019 12:00:00 AM EST
$ date --date="next week thu"
Thu 05 Dec 2019 12:00:00 AM EST

date 命令的手册页列出了其所有选项。该列表多得令人难以置信,但是你可能会发现一些日期/时间显示选项非常适合你。以下是一些你可能会发现有趣的东西。

世界标准时间(UTC):

$ date -u
Tue 26 Nov 2019 01:13:59 PM UTC

自 1970 年 1 月 1 日以来的秒数(与 Linux 系统上日期的存储方式有关):

$ date +%s
1574774137

以下是 date 命令选项的完整列表。正如我所说,它比我们大多数人想象的要广泛得多。

  • %% 显示字母 %
  • %a 本地语言环境的缩写星期名称(例如,日 / Sun)
  • %A 本地语言环境的完整星期名称(例如,星期日 / Sunday)
  • %b 本地语言环境的缩写月份名称(例如 一 / Jan)
  • %B 本地语言环境的完整月份名称(例如,一月 / January)
  • %c 本地语言环境的日期和时间(例如 2005年3月3日 星期四 23:05:25 / Thu Mar 3 23:05:25 2005)
  • %C 世纪;类似于 %Y,但省略了后两位数字(例如,20)
  • %d 月份的天(例如,01)
  • %D 日期;与 %m/%d/%y 相同
  • %e 月份的天,填充前缀空格;与 %_d 相同
  • %F 完整日期;与 %Y-%m-%d 相同
  • %g ISO 周号的年份的后两位数字(请参见 %G
  • %G ISO 周号的年份(请参阅 %V);通常仅配合 %V 使用
  • %h%b 相同
  • %H 24 小时制的小时(00..23)
  • %I 12 小时制的小时(01..12)
  • %j 一年的天(001..366)
  • %k 24 小时制的小时,填充前缀空格( 0..23);与 %_H 相同
  • %l 12 小时制的小时,填充前缀空格( 1..12);与 %_I 相同
  • %m 月份(01..12)
  • %M 分钟(00..59)
  • %n 换行符
  • %N 纳秒(000000000..999999999)
  • %p 本地语言环境中等同于 AM 或 PM 的字符串;如果未知,则为空白
  • %P%p,但使用小写
  • %q 季度(1..4)
  • %r 本地语言环境的 12 小时制时间(例如,晚上 11:11:04 / 11:11:04 PM)
  • %R 24 小时制的小时和分钟;与 %H:%M 相同
  • %s 自 1970-01-01 00:00:00 UTC 以来的秒数
  • %S 秒(00..60)
  • %t 制表符
  • %T 时间;与 %H:%M:%S 相同
  • %u 星期(1..7);1 是星期一
  • %U 年的周号,以星期日为一周的第一天,从 00 开始(00..53)
  • %V ISO 周号,以星期一为一周的第一天,从 01 开始(01..53)
  • %w 星期(0..6);0 是星期日
  • %W 年的周号,星期一为一周的第一天,从 00 开始(00..53)
  • %x 本地语言环境的日期表示形式(例如,1999年12月31日 / 12/31/99)
  • %X 本地语言环境的时间表示形式(例如,23:13:48)
  • %y 年的最后两位数字(00..99)
  • %Y 年份
  • %z +hhmm 格式的数字时区(例如,-0400)
  • %:z +hh:mm 格式的数字时区(例如,-04:00)
  • %::z +hh:mm:ss 格式的数字时区(例如,-04:00:00)
  • %:::z 数字时区,: 指明精度(例如,-04, +05:30)
  • %Z 字母时区缩写(例如,EDT)

via: https://www.networkworld.com/article/3481602/displaying-dates-and-times-your-way-with-linux.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:wxy 校对:校对者ID

本文由 LCTT 原创编译,Linux中国 荣誉推出