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"
请注意,这取决于date
GNU Coreutils 中的 GNU 版本。其他版本的日期可能不支持将 time_t 值转换回带有@
.除非您已经安装了 GNU coreutils,否则这可能在您的 AIX 系统上不可用,因此gawk
可能是转换回格式化日期的最佳选择:
echo "$D" | gawk '{print strftime("%c", $0)}'
我最初的答案建议使用普通的 awk,但在我的 debian 系统上进行的进一步测试表明,既没有mawk
也original-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 是我的时区。我假设您可以使用任何合适的时区。