在 Unix Bash 命令行上,我想使用基本操作系统(例如,无 Perl 或 Python)计算 1125 天前的日期。
在运行的系统上GNU 日期,我可以这样做:
ubuntu $ date --date="1125 days ago"
Wed Nov 7 15:12:33 PST 2007
FreeBSD 或 MacOSX 系统不附带 GNU Date,并且不支持“X 天前”之类的值。
freebsd81 $ date --date="+1125 days ago"
date: illegal option -- -
我能在 Mac 或 FreeBSD 系统上计算几天前的日期,但这仅限于几天:
# Today is really Dec 6, 2010. 4 days ago it was:
macosx $ TZ=GMT+96 date +%Y%m%d
20101202
# But that doesn't work if I want to see the date 8 days ago:
macosx $ TZ=GMT+192 date +%Y%m%d
20101206
我可以在非 GNU 系统上计算旧日期,而无需深入研究 Perl 或 Python 等工具吗?或者我必须使用更强大的脚本语言?
答案1
好吧,你可以做一些偷偷摸摸的事情,比如:
$ echo "`日期 +%s` - (1125 * 24 * 60 *60)" |bc 1194478815 $ 日期-r 1194478689 2007 年 11 月 7 日星期三 18:38:09 -0500
在 OpenBSD(绝对非基于 gnu 的日期)上进行了测试,并且似乎可以工作。
分步骤分解:
- 获取当前的unixtime(自unix纪元开始以来的秒数):
$ 日期 +%s 1291679934
- 获取 1125 天的秒数
$回显“1125 * 24 * 60 * 60”|公元前 97200000
一个减去另一个 (1291679934 - 97200000) = 1194478815
使用新的unixtime(1194478815)打印一个漂亮的日期
$ 日期-r 1194478689 2007 年 11 月 7 日星期三 18:38:09 -0500
作为替代方案,在Solaris 上您可以执行以下操作来打印日期*:
/bin/echo "0t1194478815>Y\n<Y=Y" |adb
* 参考自http://www.sun.com/bigadmin/shellme/
另外,Solaris 上从 date 命令获取当前时间戳的另一种方法是:
/usr/bin/truss /usr/bin/日期 2>&1 | nawk -F= '/^time()/ {gsub(/ /,"",$2);打印 $2}'
** 参考自http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris
答案2
之前的答案太复杂了。 FreeBSD/macOS 有,-v
的标志date
,来自手册页(简要描述):
根据 val 调整(即获取当前日期并显示调整结果;而不是实际设置日期)秒、分、小时、月日、星期几、月或年。如果 val 前面带有加号或减号,则根据剩余字符串向前或向后调整日期,否则设置日期的相关部分。使用这些标志可以根据需要多次调整日期。标志按照给定的顺序进行处理。
因此,为了您的目的,date -v1125d
只会做您需要的事情
$ date; date -v-1125d
Thu 19 Oct 2017 11:35:25 EDT
Sat 20 Sep 2014 11:35:25 EDT
答案3
我遇到了类似的问题,我发现了日期工具包对于 OpenBSD 6.4。对我来说这是一个简单的 pkg_add dateutils 。
#!/bin/ksh
# Using dateutils dadd (get current date) -1month -f (format to strftime)
# Set Year in YYYY formant y is YY format
lastMonth=$(dadd date -1mo -f "%Y.%m")
echo $lastMonth
mkdir /home/$usr/History/$lastMonth
我的输出是
#2018.11
更新1
我在 2018.12.10 运行这个命令
HostNameHere# dadd date -1125d -f "%Y.%m"
结果
2015.11
它支持我能告诉的任何时间加法或减法。这是命令帮助打印出来的。#dadd -h
(这不是打印输出的全部内容。还有有关选项的更多信息。
Usage: dadd [OPTION]... [DATE/TIME] [DURATION]
Add DURATION to DATE/TIME and print the result.
If DATE/TIME is omitted but DURATION is given, read a list of DATE/TIMEs from
stdin. If DURATION is omitted but DATE/TIME is given, read a list of DURATIONs from
stdin.
Durations are specified as nY, nMO, nW, or nD for years, months, weeks, or days
respectively, or nH, nM, nS for hours, minutes, and seconds, where N is a
(possibly negative) number. The unit symbols can be written lower-case as well
(y, mo, w, d, h, m, s) and the unit symbol `d' can be omitted.
Note that duration addition is not commutative!
2000-03-30 +1mo +1d -> 2000-05-01
2000-03-30 +1d +1mo -> 2000-04-30
这里是命令。
这里是格式选项。