如何从 Solaris 11 上的 bash shell 中的日期中减去天数?

How subtract days from date in bash shell on Solaris 11?

几天来我一直在尝试 $days 从日期 $date 使用格式 yyyy-MM-dd 进行减法,但在 Solaris 11 上没有任何效果。一些解决方案是 'trick' 时区,但这取决于时区,我认为这就是一个技巧。

我想要一个更便宜的解决方案,因为我唯一能想到的就是将日期转换为 julian 表示,然后减去一天并再次获得 yyyy-MM-dd 表示,例如:

date=2000-12-31
days=1
julian=$(toJulian $date)
resultJulian=$(subtractDays $julian $days)
resultGregorian=toGregorian $resultJulian

那么,如果没有所有这些过程,我怎么能做到呢?谢谢。

如果您没有 GNU date 或 GNU awk,请考虑 perl:

subtractDays() {
  local date numDays
  date=
  numDays=

  date=$date days=$numDays perl -e '
    use Env qw(date days);
    use Time::Piece;
    use Time::Seconds;

    my $start_time = Time::Piece->strptime($date, "%Y-%m-%d");
    my $end_time = $start_time - (ONE_DAY * $days);
    print $end_time->ymd . "\n";'
}

...此后:

subtractDays 2000-12-31 1

...发出...

2000-12-30

这是 Solaris 11 的解决方案:

#!/bin/bash
mydate="2016-08-01"
days=3
date_in_the_past=$(gdate -d "${mydate} - ${days} days")

你可能想知道为什么我说 gdate 不可用?

好吧,GNU Date 实际上在 Solaris 11 安装中默认可用。它通过 gdate 命令访问(完整路径是 /usr/bin/gdate)。

一些背景:GNU Date 是 "GNU Coreutils" 软件包的一部分,除非您的客户主动选择排除它,否则该软件包会安装在任何 Solaris 11 服务器上。我怀疑是这样。

那么gdate是不是有什么地方,但是你说找不到?原因可能是您位于本地区域,而不是全局区域。这个特定的包在创建时默认不会传播到本地区域。这是为了(误入歧途,如果你问我)节省磁盘的努力 space。许多 Solaris 管理员不太了解全局区域和局部区域之间的这种区别。

当您向 Solaris 管理员解释实际上二进制文件已经物理驻留在磁盘上时,他们突然变得更容易接受执行所需的命令:

来自本地区域:

pkg install file/gnu-coreutils

以上命令实际上并没有走出服务器。它不会从远程包存储库中获取包。即使您在服务器与任何网络分离时执行该命令,该命令也能正常工作,因为该程序包已在磁盘上。一旦您向您的 Solaris 管理员解释了这一点,他通常就会同意执行该命令。