Solaris UNIX 中是否有任何工具(因此没有可用的 GNU 工具)可以减去日期?我知道在 Linux 中我们gawk
可以从一个日期中减去另一个日期。但在 Solaris 中,我们拥有的最大值是nawk
(改进的awk
),它无法执行日期计算。我也不能使用perl。
有什么方法可以进行日期计算吗20100909 - 20001010
?
更新:bc
能够执行日期计算吗?
答案1
不幸的是,没有一个 POSIX 命令行实用程序提供日期算术。如果你有的话,date -d
和date +%s
是你的最佳选择,但它们是 GNU 扩展。
有一个笨拙的 hacktouch
可以用来检查日期是否至少是 n 天前的:
touch -t 201009090000 stamp
if [ -n "$(find stamp -mtime +42)" ]; then ...
(请注意,如果 DST 在时间间隔内开始或停止并且脚本在凌晨 1 点之前运行,则此代码可能会关闭 1。)
有几个人最终在 Bourne 或 POSIX shell 中实现了日期操作库。中有一些示例和链接comp.unix.shell 常见问题解答。
安装 GNU 工具可能是最省力的方法。
答案2
我会尝试使用date
POSIX 一部分的命令,因此它几乎无处不在。更新:不幸的是,-d 似乎不是 POSIX 日期的一部分,并且在 Solaris 上可能不存在。因此,这可能不会回答OP的问题。
d1=`date -d 20100909 +%s`
d2=`date -d 20001010 +%s`
现在d1
和d2
是对应于 UNIX 纪元以来的秒数的整数。因此,为了获得两者之间的差异,我们减去($((d1-d2))
在 bash 中)并转换为我们想要的任何单位。日子是最轻松的:
echo "$(((d1-d2)/86400)) days"
如果您没有 bash,如何进行转换可能会有所不同。最便携的方法可能是使用expr
(expr 的 posix 手册页)。
答案3
这是我刚刚编写的 awk 脚本,应该与 POSIX awk 一起使用。您必须尝试 Solaris 版本;请记住,Solaris 上也有两个版本的 Awk,一种位于 /bin 中,另一种位于 /usr/xpg4/bin/awk 中(我相信是 nawk)。
BEGIN {
daysofmonth["01"] = 0; daysofmonth["02"] = 31; daysofmonth["03"] = 59;
daysofmonth["04"] = 90; daysofmonth["05"] = 120; daysofmonth["06"] = 151;
daysofmonth["07"] = 181; daysofmonth["08"] = 212; daysofmonth["09"] = 243;
daysofmonth["10"] = 273; daysofmonth["11"] = 304; daysofmonth["12"] = 334;
fullday = 86400;
}
/[12][09][0-9][0-9][01][0-9][0123][0-9]/ {
year = substr($0, 1, 4); month = substr($0, 5, 2); day = substr($0, 7, 2);
date = ((year - 1970) * 365.25) + daysofmonth[month] + day - 1;
if ((year % 4) == 0 && month > 2) { date = date + 1; }
print date * fullday - (25200);
}
{}
传递 YYYYmmdd 日期字符串,它将转换为自纪元以来的秒数(在日边界上有一点给出)。然后你就可以将两者相减。
today=`echo 20110210 | awk -f convdate.awk`
then=`echo 20001231 | awk -f convdate.awk`
sincethen=`expr $today - $then`