Gil*_*il' 13
不幸的是,没有一个 POSIX 命令行实用程序提供日期算术。date -d并且date +%s是如果你有他们的路要走,但他们是GNU扩展。
有一种笨拙的黑客touch方法可以检查日期是否至少是过去 n 天:
touch -t 201009090000 stamp
if [ -n "$(find stamp -mtime +42)" ]; then ...
Run Code Online (Sandbox Code Playgroud)
(请注意,如果 DST 在时间间隔内开始或停止并且脚本在凌晨 1 点之前运行,则此代码可能会关闭 1。)
有几个人最终在 Bourne 或 POSIX shell 中实现了日期操作库。comp.unix.shell FAQ中有一些示例和链接。
安装 GNU 工具可能是最不痛苦的方式。
Ste*_*n D 11
我会尝试使用作为datePOSIX 一部分的命令,因此它几乎无处不在。更新:不幸的是,-d 似乎不是 POSIX 日期的一部分,并且可能不在 Solaris 上。因此,这可能无法回答 OP 问题。
d1=`date -d 20100909 +%s`
d2=`date -d 20001010 +%s`
Run Code Online (Sandbox Code Playgroud)
现在d1和d2是与 unix 纪元以来的秒数相对应的整数。因此,为了获得两者之间的差异,我们减去($((d1-d2))在 bash 中)并转换为我们想要的任何单位。日子是最简单的:
echo "$(((d1-d2)/86400)) days"
Run Code Online (Sandbox Code Playgroud)
如果您没有 bash,如何进行转换可能会有所不同。最便携的方法可能是使用expr(expr 的 posix 手册页)。
Arc*_*ege 10
这是我刚刚写的一个 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);
}
{}
Run Code Online (Sandbox Code Playgroud)
传递一个 YYYYmmdd 日期字符串,它将被转换为自 Epoch 以来的秒数(在日期边界上有一点让步)。然后你就可以减去这两个。
today=`echo 20110210 | awk -f convdate.awk`
then=`echo 20001231 | awk -f convdate.awk`
sincethen=`expr $today - $then`
Run Code Online (Sandbox Code Playgroud)
作为记录,dateutils是我尝试提供一组涵盖日期算术的便携式工具。你的例子归结为
ddiff -i '%Y%m%d' 20001010 20100909
=>
3621
Run Code Online (Sandbox Code Playgroud)
该-i指定的输入格式。