在UNIX shell脚本中从日期减去1小时

68
我在一个shell脚本中有以下代码。如何减去一个小时并保留格式?
DATE=`date "+%m/%d/%Y -%H:%M:%S"`
9个回答

99

以下命令适用于最近版本的GNU date

date -d '1 hour ago' "+%m/%d/%Y -%H:%M:%S"

1
我收到了一个错误信息:-date: 非法选项 -- d 用法:date [-u] mmddHHMM[[cc]yy][.SS] date [-u] [+格式] date -a [-]sss[.fff] - shamir chaikin
@shamir 这意味着你的日期版本不支持此选项。 - dogbane
我找到了解决方法 - 我发布它是因为也许你知道在Solaris机器上做这件事的其他方式? - shamir chaikin
1
@shamir,最简单的方法可能是安装GNU日期。您可以使用不同的前缀或路径,以便它不会与“官方”冲突。当我在Solaris上做很多工作时,我在/home/karl/bin中安装了许多GNU实用程序,因为它们具有这些方便的额外选项。 - Karl Bielefeldt

19
date -v-60M "+%m/%d/%Y -%H:%M:%S"

DATE=`date -v-60M "+%m/%d/%Y -%H:%M:%S"`

如果您的Bash版本是4.4+,您可以使用Bash内置的日期打印和算术功能:

printf "current date: %(%m/%d/%Y -%H:%M:%S)T\n"
printf "date - 60min: %(%m/%d/%Y -%H:%M:%S)T\n" $(( $(printf "%(%s)T") - 60 * 60 ))

$(printf "%(%s)T")会打印出当前时间的秒数,$(( epoch - 60*60 ))是bash算术运算,表示减去1小时的秒数。输出结果为:

current date: 04/20/2017 -18:14:31
date - 60min: 04/20/2017 -17:14:31

1
这不是可移植的,而且依赖于BSD date功能。 - tripleee
@tripleee,"portable"是哪个日期?记住这里有无数的BSD机器,例如MacOS。Linux(感谢上帝)不是唯一的类Unix操作系统。此外,第二种解决方案根本不使用日期......所以... - clt60
1
在 POSIX 中指定日期的唯一选项是 -u。这可能仍然不是完全可移植的,但这是一个合理的基准。我并不是说你必须想出一个解决方案,只是指出一个事实,这可能会让尝试使用你的答案中的信息的访问者感到惊讶。 - tripleee

12

如果你需要对时间戳进行减法计算:

timestamp=$(date +%s -d '1 hour ago');

1
这不是可移植的,而且依赖于GNU“date”的功能。 - tripleee

4
$ date +%Y-%m-%d-%H 
2019-04-09-20

$ date -v-1H +%Y-%m-%d-%H 
2019-04-09-19

但是在shell中的使用方式就像这样 date +%Y-%m-%d-%H, date -v-1H +%Y-%m-%d-%H


4
-v 选项与 BSD 的 date 命令相似(在 macOS 上也是这样),而不是 GNU 的 date - tripleee

3
如果您需要在减去新格式之前更改时区:
$(TZ=US/Eastern date -d '1 hour ago' '+%Y-%m-%d %H:%M')

1
这不是可移植的,而且依赖于GNU date功能。 - tripleee

3

这段命令适用于我的Ubuntu 16.04操作系统,date命令如下所示: date --date="@$(($(date +%s) - 3600))" "+%Y/%m/%d -%H:%M:%S" 其中的date版本为date (GNU coreutils) 8.25


这不是可移植的,而且依赖于GNU date功能。 - tripleee

2

将其转换为时间戳(一个长整数),减去正确的毫秒数,重新格式化为所需的格式。

由于您没有指定编程语言,因此很难提供更多细节......


啊啊.. 我正在使用shell脚本,我的公式如下 -DATE=date "+%m/%d/%Y -%H:%M:%S" ,我想从DATE中减去1小时。 - shamir chaikin
1
你需要留在shell吗?一个内联的awk或perl脚本可以轻松地减去一小时并以所需的格式输出。 - CoreyStup

2

还有另一种减少1小时的方法。

yesterdayDate=`date -d '2018-11-24 00:09 -1 hour' +'%Y-%m-%d %H:%M'` 
echo $yesterdayDate

Output:
2018-11-23 23:09

我希望它能帮助某些人。

这不是可移植的,而且依赖于GNU date功能。 - tripleee

-1
DATE=date -1H "+%m/%d/%Y -%H:%M:%S"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接