在 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 脚本时,使用 date 命令特别有帮助,例如,$ 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。

回复 作者 anon (未验证)

每当有人提到 cal 时,我总是会想起 1750 年的《日历法案》,它给我们带来了这个美妙的东西

$ cal 9 1752
1752年9月
日 一 二 三 四 五 六
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本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.