在Solaris 11上,如何从bash shell中的日期中减去天数?
几天来,我一直在尝试subtrac,其格式为yyyy MM dd,但在Solaris 11上没有任何效果。有些解决方案是时区的“把戏”,但它取决于时区,我认为这正是一个把戏 我想要一个更便宜的解决方案,因为我唯一能想到的是将日期转换为julian表示,然后减去一天,然后再次获得yyyy MM dd表示,例如:在Solaris 11上,如何从bash shell中的日期中减去天数?,bash,date,solaris,subtraction,sunos,Bash,Date,Solaris,Subtraction,Sunos,几天来,我一直在尝试subtrac,其格式为yyyy MM dd,但在Solaris 11上没有任何效果。有些解决方案是时区的“把戏”,但它取决于时区,我认为这正是一个把戏 我想要一个更便宜的解决方案,因为我唯一能想到的是将日期转换为julian表示,然后减去一天,然后再次获得yyyy MM dd表示,例如: date=2000-12-31 days=1 julian=$(toJulian $date) resultJulian=$(subtractDays $julian $days) res
date=2000-12-31
days=1
julian=$(toJulian $date)
resultJulian=$(subtractDays $julian $days)
resultGregorian=toGregorian $resultJulian
那么,没有这些过程我怎么能做到呢?谢谢。 < P>如果没有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
如果您没有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
以下是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是否在某处,但你说你找不到它?原因可能是您所在的区域是局部区域,而不是全局区域。在创建本地区域时,默认情况下,此特定包不会传播到本地区域。这样做是为了节省磁盘空间(如果你问我的话,这是错误的)。全局区域和本地区域之间的这种差异对于许多Solaris管理员来说有些未知
当您向Solaris管理员解释二进制文件实际上已经实际驻留在磁盘上时,他们突然可以接受执行所需的命令:
从本地区:
pkg install file/gnu-coreutils
上面的命令实际上并不在服务器之外。它不会从远程包存储库获取包。即使在服务器与任何网络分离时执行该命令,该命令也会起作用,因为磁盘上已经存在该包。一旦您向Solaris管理员解释了这一点,他通常不会介意执行该命令。以下是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是否在某处,但你说你找不到它?原因可能是您所在的区域是局部区域,而不是全局区域。在创建本地区域时,默认情况下,此特定包不会传播到本地区域。这样做是为了节省磁盘空间(如果你问我的话,这是错误的)。全局区域和本地区域之间的这种差异对于许多Solaris管理员来说有些未知
当您向Solaris管理员解释二进制文件实际上已经实际驻留在磁盘上时,他们突然可以接受执行所需的命令:
从本地区:
pkg install file/gnu-coreutils
上面的命令实际上并不在服务器之外。它不会从远程包存储库获取包。即使在服务器与任何网络分离时执行该命令,该命令也会起作用,因为磁盘上已经存在该包。一旦您向Solaris管理员解释了这一点,他通常会同意执行该命令。重要的不是bash,而是您可以使用哪个版本的
date
。某些Solaris系统将安装GNU工具,即使不在默认路径中。除非您的系统安装了GNU core utils包,否则这可能是您所能做到的最好的。陛下您只是在此处显示p-code,这样您就不会真正调用“函数”,而是将特殊参数提交到date
。查看转换为一些-s
(自1970年以来的秒数)值,然后从该值中减去24*60*60秒。如果您有GNU UTIL,那么应该有一个单独的date
cmd,其中包含大量扩展的日期数学功能。我还认为较新版本的gawk
也可以进行日期计算,但您必须执行mangawk
才能确定。顺便说一句,resultGregorian=toGregorian$resultJulian
正在运行$resultJulian
作为命令展开的任何内容,在环境中将resultGregorian
临时设置为toGregorian
。当然那不是你想要的。@Shellester,…是的,当然,但是如果OP有gawk
,他们有GNU工具,所以他们可能也有gdate
。@CharlesDuffy:是的,我不确定gdate
(g(yourCmdHere)
)惯例被遵守的程度有多广。祝大家好运。重要的不是它是bash,而是你有哪个版本的date
。某些Solaris系统将安装GNU工具,即使不在默认路径中。除非您的系统安装了GNU core utils包,否则这可能是您所能做到的最好的。陛下您只是在此处显示p-code,这样您就不会真正调用“函数”,而是将特殊参数提交到date
。查看转换为一些-s
(自1970年以来的秒数)值,然后从该值中减去24*60*60秒。如果您有GNU UTIL,那么应该有一个单独的date
cmd,其中包含大量扩展的日期数学功能。我还认为较新版本的gawk
也可以做日期计算,但你必须做mangawk
才能确定答案。顺便说一句,resultreg