在unix中减去日期

在unix中减去日期

unix中有没有办法从特定日期减去一个月或至少30天?该日期由用户输入。

例子:

2012-11-19 - 1 个月 = 2013-10-19

这个不起作用:

date -d '2013-10-13 - 1 month' '+%F'

答案1

最简单的方法是将日期转换为 unix time_t 值(即自纪元开始以来的秒数,或“1-1-1970 00:00:00”),然后从中减去 30 天 * 每天 86400 秒数字。

例如,下面的示例使用set -x以便您可以看到 D 变量的值发生变化。

#! /bin/ksh

set -x

D=$(date -d '2013-10-13' '+%s')
D=$((D - 30 * 86400))

date -d "@$D"

请注意,这取决于dateGNU Coreutils 中的 GNU 版本。其他版本的日期可能不支持将 time_t 值转换回带有@.除非您已经安装了 GNU coreutils,否则这可能在您的 AIX 系统上不可用,因此gawk可能是转换回格式化日期的最佳选择:

echo "$D" | gawk '{print strftime("%c", $0)}'

我最初的答案建议使用普通的 awk,但在我的 debian 系统上进行的进一步测试表明,既没有mawkoriginal-awk没有strftime内置该函数,因此您必须安装 GNU Coreutils 或 GNU Awk。

如果系统上安装了 perl,则可以使用 perl 代替 awk:

echo $D | perl -nE 'say scalar gmtime $_'

有几种替代方法和示例可以在以下位置执行此操作:

https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line

答案2

尝试这个:

date --date="$(date -d "Nov 1 2012")-1 month" +'%Y:%m:%d'
2012:10:01

2012 年 11 月 1 日用于说明。这可以是任何用户输入的日期。

答案3

您的示例在日期字符串中使用相对项目,这些项目是 GNU 日期扩展。

例如,在 Fedora 19 上,您的示例按预期工作:

$ date -d '2013-10-13 - 1 month' '+%F'
2013-09-13

因此,您可以确保您的脚本使用 GNU 日期。

答案4

尝试这个。

DAY30=`TZ=EST+720 date "+%Y-%m-%d"`

print $DAY30

720 是以小时为单位的偏移量。所以,30 天就是 720 小时。

EST 是我的时区。我假设您可以使用任何合适的时区。

相关内容