技术提示
在 Linux/UNIX 平台上工作时,我经常发现获取过去或未来的日期和时间很有用。无论是安排作业、搜索特定日期的文件还是确定特定日期是星期几,无数场景都需要一个例程来计算和显示过去或未来的日期和时间。我搜索了一个合适的程序,但最终不得不自己编写一个。这个程序叫做 showdate。它最初是用 C 语言在 UNIX 上编写的,并且也被移植到了 Linux。您可以从 LJ FTP 站点下载代码:ftp.linuxjournal.com/pub/lj/listings/issue163/9877.tgz。
获取源代码后,使用 ANSI C 编译器(cc 或 gcc)组装 showdate 可执行文件,如下所示
# cc showdate.c -o showdate
将可执行文件存储在 /usr/local/bin 或您选择的目录中,并调用它时不带任何参数以获取用法
# showdate usage: showdate [-y [+|-]years] [-m [+|-]months] [-d [+|-]days] [-h [+|-]hours] [-M [+|-]minutes] [-s [+|-]seconds] [-e | -f format]
showdate 识别以下命令行选项和参数
-y [+|-]years: 过去 (-) 或未来 (+) 的年数偏移量,相对于当前年份。
-m [+|-]months: 过去 (-) 或未来 (+) 的月数偏移量,相对于当前月份。
-d [+|-]days: 过去 (-) 或未来 (+) 的天数偏移量,相对于当前日期。
-h [+|-]hours: 过去 (-) 或未来 (+) 的小时数偏移量,相对于当前小时。
-M [+|-]minutes: 过去 (-) 或未来 (+) 的分钟数偏移量,相对于当前分钟。
-s [+|-]seconds: 过去 (-) 或未来 (+) 的秒数偏移量,相对于当前秒数。
-e: 显示自 UNIX 纪元(1970 年 1 月 1 日 UTC)以来经过的秒数。
-f format: 根据 format 中指定的格式指令显示日期和时间。
选项 e 和 f 不兼容。在命令行中同时指定它们会异常终止程序。showdate 的默认输出可以使用格式指令和 -f 的参数进行调整,这些指令和参数与标准 date 命令使用的指令和参数相同。重要的是,所有计算都是通过从当前日期和时间(现在)获取正(未来)或负(过去)偏移量来执行的,这是它的基准。
快速熟悉任何工具的一个好方法是了解如何使用它。例如,显示相对于现在十年前的日期和时间的命令将是(showdate 的输出已被省略,因为结果取决于 now 的值)
# showdate -y -10
要找出上述场景经过的纪元秒数,请使用
# showdate -y -10 -e
从现在起五年、两个月零 23 天的未来日期,以 YY-MM-DD 格式输出如下。加号对于未来日期是可选的,以下两种形式的命令行是等效的(减号对于过去日期是强制性的)
# showdate -y +5 -m +2 -d +23 -f %Y-%m-%d # showdate -y 5 -m 2 -d 23 -f %Y-%m-%d
只要它们的上下文用法明确,选项可以以任何顺序出现;因此,上面的命令行可以写成
# showdate -m 2 -f %Y-%m-%d -d 23 -y 5
+- 偏移量可以在单个命令行中组合;但是,将它们混合使用可能会导致意外和错误的结果。如果现在是 2003 年 1 月 1 日凌晨 12:00:00 UTC,showdate 输出
# showdate -m -8 -M 32 Wed May 1 00:32:00 2002
上面的命令显示了过去的日期和时间——八个月前但现在起 32 分钟,而下面的命令显示了未来的日期和时间——现在起 8 个月但 32 分钟前
# showdate -m 8 -m -32 Sun Aug 31 23:28:00 2003
showdate 的功能可以用于指定亚分钟作业调度时间。快速安排从现在起 12 分钟 35 秒的批处理作业的方法是
# showdate -M 12 -s 35 -f %Y%m%d%H%M.%S | xargs at -f job-file -t
当前日期和时间被跟踪为自纪元以来经过的秒数。这个数字存储在一个有符号长整型中,这意味着在 32 位系统上,时间记录将在 2038 年 1 月 19 日星期二 03:14:08 UTC 崩溃,届时该值将溢出并变为负数。如果所需的日期和时间超过此限制,则会返回错误,如下所示
# showdate -y 1000 showdate: required time exceeds system limit
格式指令中空格字符的存在需要转义或用引号(单引号/双引号)括起来。因此,以 年-月-日 时:分:秒 格式显示 18 小时 30 分钟前的日期和时间的命令将是
# showdate -h -18 -M -30 -f "%Y-%m-%d %H:%M:%S"
showdate 无法通过指定每周偏移量以及从任何基准(而不仅仅是当前日期和时间)获取正或负偏移量来获取日期和时间。即使 showdate 经过了严格的尝试和测试,它也不是完美的。如果任何人遇到错误或认为重新设计算法、实现编码快捷方式或有效使用系统资源可以改进程序,请通过电子邮件 ssahore@yahoo.com 与我联系。
showdate 旨在根据命令行选项计算和显示过去或未来的日期和时间,这些选项指定为相对于当前日期和时间的偏移量。下一步将是增强 showdate 以指定周,并能够更改其基准。
dirs 命令与 pushd 和 popd 结合使用,对于跟踪用户的目录更改非常有效。假设您必须对以下目录中存在的文件进行一些更改
/home/sangeeth/soft/release2/src/
/home/sangeeth/soft/release2/src/show/
/home/sangeeth/soft/release2/doc/
与其在纸上记下目录,不如执行以下操作
$ pushd /home/sangeeth/soft/release2/src/ $ pushd /home/sangeeth/soft/release2/src/show/ $ pushd /home/sangeeth/soft/release2/doc/
要列出所有目录,请执行以下操作
$ dirs -l -p -d
假设您在第一个目录(/home/sangeeth/soft/release2/src/)中进行了所有必需的更改。要从您先前创建的目录列表中删除该目录条目,请执行以下操作
$ popd
上面的命令删除最顶层的目录条目(/home/sangeeth/soft/release2/src/)并执行 cd 到新的顶层目录,在我的例子中,这将是第二个目录(/home/sangeeth/soft/release2/src/show/)。
或者,可以通过给出目录 ID(在使用时,ID 显示在目录旁边dirs -l -p -d)到 popd 命令,从目录列表中弹出一个特定目录
$ popd +1
有关使用上述命令的更多选项,请查看 man 页面。