UNIX 中用于减去日期的工具

UNIX 中用于减去日期的工具

Solaris UNIX 中是否有任何工具(因此没有可用的 GNU 工具)可以减去日期?我知道在 Linux 中我们gawk可以从一个日期中减去另一个日期。但在 Solaris 中,我们拥有的最大值是nawk(改进的awk),它无法执行日期计算。我也不能使用perl。

有什么方法可以进行日期计算吗20100909 - 20001010

更新:bc能够执行日期计算吗?

答案1

不幸的是,没有一个 POSIX 命令行实用程序提供日期算术。如果你有的话,date -ddate +%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

我会尝试使用datePOSIX 一部分的命令,因此它几乎无处不在。更新:不幸的是,-d 似乎不是 POSIX 日期的一部分,并且在 Solaris 上可能不存在。因此,这可能不会回答OP的问题。

d1=`date -d 20100909 +%s`
d2=`date -d 20001010 +%s`

现在d1d2是对应于 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`

答案4

Perl 很可能已经安装,并且可以很容易地从CPAN,将它们安装在您的主目录中,并且参考他们在你的程序中。在这种情况下,日期::计算模块有一个Delta_Days可以提供帮助的子例程。

相关内容