在 Linux 中使用命令行日历和日期功能

488 位读者喜欢这篇文章。
System statistics with sar and the /proc filesystem

ajmexico。由 Jason Baker 修改。CC BY-SA 2.0。

我一直对历史日期感兴趣,并想确定某个事件实际发生在一周中的哪一天。美国独立宣言是在一周中的哪一天签署的?我出生在一周中的哪一天?1876 年 7 月 4 日是在一周中的哪一天?我知道你可以使用搜索引擎来回答许多这些问题。但是,您是否知道 Linux 命令行也可以提供这些答案?

1776 年 7 月 4 日是星期四。1876 年 7 月 4 日是星期二。我妈妈很快就要过生日了,我知道她出生在 11 月 6 日星期六。(我不能告诉你哪一年,因为她不想让别人知道她的年龄。)

Linux 的 date 和 calendar 命令的功能远不止提供这些有趣的花絮。以下是一些您可以在命令行中发出的简单 cal 命令示例

显示当前日历月:$ cal

November 2016      
Su Mo Tu We Th Fr Sa  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
27 28 29 30   

显示特定月份的日历:$ cal -m February

   February 2016      
Su Mo Tu We Th Fr Sa  
    1  2  3  4  5  6  
 7  8  9 10 11 12 13  
14 15 16 17 18 19 20  
21 22 23 24 25 26 27  
28 29     

显示带有儒略日的日历:$ cal -j

       November 2016         
 Su  Mo  Tu  We  Th  Fr  Sa  
        306 307 308 309 310  
311 312 313 314 315 316 317  
318 319 320 321 322 323 324  
325 326 327 328 329 330 331  
332 333 334 335 

显示当前月份、上个月和下个月:$ cal -3

 October               November              December        
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
                   1         1  2  3  4  5               1  2  3  
 2  3  4  5  6  7  8   6  7  8  9 10 11 12   4  5  6  7  8  9 10  
 9 10 11 12 13 14 15  13 14 15 16 17 18 19  11 12 13 14 15 16 17  
16 17 18 19 20 21 22  20 21 22 23 24 25 26  18 19 20 21 22 23 24  
23 24 25 26 27 28 29  27 28 29 30           25 26 27 28 29 30 31  
30 31 

您可以使用 $ cal -y 显示全年,或使用 $ cal -jy 显示儒略日,从 1 月 1 日的 1 开始,到 12 月 31 日的 365 或 366(如果是闰年)结束。您还可以使用相关的 ncal 命令找出稍微复杂的日期。例如,$ ncal -e 显示当年复活节的日期。

像大多数命令行工具一样,日历工具可以与管道或其他函数组合使用。如果您想要整年的打印输出,然后将日历命令通过管道传输到文本文件,您可以简单地运行 $ cal 2016 > YearlyCalendar.txt。该文本文件可以在任何文本编辑器中打开和编辑,或保存为 PDF 并共享。

Linux 中的 date 命令可以显示多种格式的日期,或设置计算机 Linux 操作系统上的日期。date 命令可以与 shell 脚本结合使用,例如,轻松地将日期附加到您正在编辑的文件中。除了日历日期之外,还可以指定时间。以下是一些示例。

您可以使用以下命令显示今天的日期:$ date

Wed Nov 2 21:20:22 EDT 2016

您还可以将一种日期格式转换为另一种日期格式。例如,要转换为日期标准格式,请使用:$date --date="11/30/16"

Wed Nov 30 00:00:00 EST 2016

也可以指定时间:$ date --date="December 1 2017 12:00:00"

Fri Dec 1 12:00:00 EST 2017

您还可以指定日期格式。例如,对于 YYYY-Mo-Day 格式,请使用 $ date +%F,或者通过指定要显示的精确详细信息来提供更高的精度,例如 $ date +"%y-%m-%d"。您也可以直接指定时间格式:$ date +%H 以 24 小时格式显示当前小时,而 $ date +%I 将以 12 小时格式显示。

date 也有一些快捷方式,例如,$ date --date "next monday"$ date --date "yesterday",这在脚本上下文中可能很有用。处理日期在编写 Bash 脚本时尤其有用,例如,$ echo "Today is $(date)" 将输出 Today is Tue Dec 6 2016 15:53:41 2016。或者通过附加日期轻松创建文件备份,例如,$ cp foo.txt "foo.txt.$(date +%F)" 以添加今天的日期。

要了解更多信息或查看 date 命令的更多示例,请查看 Gnu Coreutils 文档。

标签
User profile image.
教育家、企业家、开源倡导者、终身学习者、Python 教师。教育心理学硕士,教育领导学理学硕士,Linux 系统管理员。

15 条评论

很棒的文章,Don!我在脚本中使用的一个有趣的日期技巧是从我的手机中拉取上个月的照片

CURRENT_DATE="$(date +%Y-%m-15) -1 month"
YYYYMM=$(date --date="${CURRENT_DATE}" +%Y%m)

通过提供正确的格式参数,您可以使用 date 命令完成的操作真是令人难以置信。

你好 Ben,祝你节日快乐。关于你的脚本的问题。1.) 这只是一个提醒,还是设置为从你的手机中拉取照片。

2.) 如果是,这是设置为在你的手机上工作吗?如果是,你正在使用什么程序?

回复 ,作者 bcotton

-I (大写 i) 等于 '+%F' :)

# cp foo{,_$(date -I)}.txt
# cp foo{,_$(date '+%F')}.txt

// foo_yyyy-mm-dd.txt

非常有用的文章。的确,date 命令,尤其是 GNU date 命令,是最强大的开源实用程序之一。date 命令的一个隐藏的宝藏或功能是 -d 或 --date 选项,它接受自由格式的人类可读日期字符串。

一年前或一年后的今天是什么日子 -
$ date -d 'last year'
Thu Dec 17 00:34:47 EST 2015
$ date -d 'next year'
Sun Dec 17 00:36:27 EST 2017

一小时前在 UTC -
$ env TZ=UTC date -d '1 hour ago'
Sat Dec 17 04:35:39 UTC 2016

还有这个 -
$ date -d '10 years ago + 3 months + 2 days'
Mon Mar 19 01:39:36 EDT 2007

我刚刚在我的网站上写了一篇关于它的博客 - GNU date 命令的实际用途

发现错误?

我正在使用 util-linux 2.28.2 中的 cal,而 cal -m February 不是这样的。

如果您在 Ubuntu 16.04LTS 上检查 'cal -m February',我想您会发现它有效。在 Fedora 上,它不会产生该结果。我发现 Fedora 使用 gnu.org,而 Ubuntu 使用 BSD。

回复 ,作者 匿名(未验证)

每当有人提到 `cal` 时,我总是会想起 1750 年的《日历法案》,它给了我们这个美丽的景色

$ cal 9 1752
September 1752
Su Mo Tu We Th Fr Sa
1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

很棒的文章和信息!

这证明我每天都可以学到有价值(且有用)的东西!
顺便说一句,它在 Android 中以某种方式实现(好吧,很容易捕捉到)……以及 HP-UX 和 AIX(都基于 system V)。
对于像我这样使用太多终端导致屏幕混乱的人来说,这是一个非常方便的工具!

感谢 Don 的精彩文章。您使用 Linux 或 UNIX 有多久了?您花了多长时间掌握命令行?

来自 Fedora
不带任何参数的 cal,显示当前月份。

cal 选项
-1, --one 仅显示一个月(默认)
-3, --three 显示跨越日期的三个月
-n, --months 显示从日期月份开始的 num 个月
-S, --span 在显示多个月时跨越日期
-s, --sunday 星期日作为一周的第一天
-m, --monday 星期一作为一周的第一天
-j, --julian 输出儒略日
-y, --year 显示全年
-Y, --twelve 显示未来十二个月
-w, --week[=] 显示美国或 ISO-8601 周数
--color[=] 对消息进行着色(自动、始终或从不)
默认启用颜色

-V, --version 输出版本信息并退出

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© 2025 open-source.net.cn. All rights reserved.