Shell添加日期保存在参数中

时间:2016-10-07 16:36:14

标签: shell date datetime unix time

希望有人能帮助我解决这里发生的事情。

我有一个脚本,以这种格式接收日期作为参数" 2016-09-01 00:00:00"并且应该创建另一个包含将来某天的日期的变量,代码在

之下
    currentDate=$1
    currentDate=$(date +"%Y-%m-%d %H:%M:%S" -d "$currentDate")
    nextDate=$(date +"%Y-%m-%d %H:%M:%S" -d "$currentDate + 1 day")
    echo $currentDate
    echo $nextDate

有时这完全正常,例如

2016-09-01 00:00:00 - 作为参数

给出的日期

2016-09-02 00:00:00 - 第二天的输出

但有时它只会增加23个小时,具体取决于提供的日期

2016-02-01 00:00:00 - 作为参数

给出的日期

2016-02-01 23:00:00 - 第二天的输出

如果我将nextDay变量更改为添加三天

     nextDate=$(date +"%Y-%m-%d %H:%M:%S" -d "$currentDate + 3 day")

它给出如下输出仅增加21小时而不是3天

2016-02-01 00:00:00 - 作为参数

给出的日期

2016-02-01 21:00:00 - 第二天的输出

有人可以帮我理解为什么会发生这种情况,是否与时区有关?

1 个答案:

答案 0 :(得分:0)

原因似乎是进行自由格式日期解析有多困难:

基准日期:(我在美国/多伦多时区的时间)

$ date -d "2016-11-06 01:00:00 + 1 day" "+%F %T%z"
2016-11-06 19:00:00-0500

尝试添加一天

$ date -d "2016-11-06 + 1 day 01:00:00" "+%F %T%z"
2016-11-07 01:00:00-0500
嗯,这很奇怪,看起来像是在增加一天,然后再表达为午夜,然后减去5个小时。

让我们尝试在日期部分添加一天

read current_date current_time < <(date -d "$1" +"%F %T%z")
echo "$current_date $current_time"
next_day=$(date -d "$current_date + 1 day $current_time" +"%F %T%z")
echo "$next_day"
three_days=$(date -d "$current_date + 3 day $current_time" +"%F %T%z")
echo "$three_days"

看起来更好。

在你的脚本中试试这个:

{{1}}