如何在Solaris 11上减去bash shell中的日期?

时间:2016-07-27 15:25:07

标签: bash date solaris subtraction sunos

我从格式为$days的日期$date开始尝试减去yyyy-MM-dd,但是在Solaris 11上没有任何工作。有些解决方案是'招'与时区,但它取决于时区,我认为这正是一个技巧。

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

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

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

2 个答案:

答案 0 :(得分:2)

如果您没有GNU日期或GNU awk,请考虑perl

subtractDays() {
  local date numDays
  date=$1
  numDays=$2

  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

答案 1 :(得分:1)

以下是Solaris 11的解决方案:

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

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

嗯,在Solaris 11安装中,GNU Date实际上是可用的。它由gdate命令访问(完整路径为/usr/bin/gdate)。

一些背景知识:GNU Date是“GNU Coreutils”软件包的一部分,此软件包安装在任何Solaris 11服务器上,除非您的客户已主动选择将其排除。我怀疑是这样的。

所以gdate在哪里,但你说你找不到它?原因可能是您在本地区域,而不是全局区域。默认情况下,此特定包在创建时不会传播到本地区域。这是在(误导,如果你问我)努力节省磁盘空间的情况下完成的。对于许多Solaris管理员来说,全局区域和本地区域之间的这种差异有点不为人知。

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

来自当地区域:

pkg install file/gnu-coreutils

上述命令实际上并不在服务器之外。它不从远程包存储库获取包。即使您在从任何网络分离服务器时执行该命令,该命令也会起作用,因为磁盘上已存在该软件包。一旦向Solaris管理员解释,他通常可以执行命令。