如何从 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 管理员解释了这一点,他通常就会同意执行该命令。
几天来我一直在尝试 $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 管理员解释了这一点,他通常就会同意执行该命令。