Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Solaris 11上,如何从bash shell中的日期中减去天数?_Bash_Date_Solaris_Subtraction_Sunos - Fatal编程技术网

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

在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

几天来,我一直在尝试subtrac,其格式为yyyy MM dd,但在Solaris 11上没有任何效果。有些解决方案是时区的“把戏”,但它取决于时区,我认为这正是一个把戏

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

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