如何使用格式化输出从给定日期减去或添加X天?

时间:2014-03-18 08:04:57

标签: bash date date-format

我做了以下功能:

#!/bin/bash

function calc_date(){
  odate=$1
  op=$2
  days=$3

  echo $(date "--date=$odate $op $days day" +%d%m%y) 
}

如果我这样称呼它:

mydate=$(calc_date '2014-02-22' '+' '2')
echo "$mydate"

返回:

240214

现在我正试图通过这种方式调用函数获得相同的输出:

mydate=$(calc_date '220214' '+' '2')
echo "$mydate"

如何将作为参数传递的日期格式化为ddmmyy格式?

5 个答案:

答案 0 :(得分:1)

您遗漏date未正确解释220214。它被解释为2022-02-14(而不是2014-02-22)。

一种解决方案是更改或调整您的格式:

$ date --date "2014-02-12 2 days ago"
Mon Feb 10 00:00:00 CET 2014

答案 1 :(得分:1)

重新格式化日期:

#!/bin/bash

function calc_date(){
    odate=$(echo $1 | sed -r 's/(..)(..)(..)/\3\2\1/')
    op=$2
    days=$3

    echo $(date "--date=$odate $op $days day" +%d%m%y) 
}

这里sed只是在2个组中匹配6个字符,然后以相反的顺序将它们打印出来。所以220214变为140222.这适用于date,它将6个字符的数字日期字符串识别为YYmmdd

答案 2 :(得分:0)

如果您的日期倒退(即您的$ op为负数),您需要在“2天”之后加上“之前”字样

date --date='2 day ago'

答案 3 :(得分:0)

这也是你可以尝试的。

#!/bin/bash

DAYS=2

CURRENTDATE="$(date +%Y%m%d)"

echo "$CURRENTDATE"

OLDERDATE="$(date "+%Y%m%d" -d "$DAYS  days ago ")"

echo "$OLDERDATE"

答案 4 :(得分:0)

最明确的解决方案:

#!/bin/bash

function calc_date(){
  odate=$(date -d "$1" +%d%m%y)
  op=$2
  days=$3

  echo $(date "--date=$odate $op $days day" +%d%m%y) 
}

示例:

mydate=$(calc_date '220214' '-' '2')
echo "$mydate"

mydate=$(calc_date '220214' '+' '3')
echo "$mydate"

结果:

200214
250214