我有一个来自conf文件的字符串(让我们调用例如date1):
#!/bin/bash
# it is example
date1="201605250925"
datenow="$(date +%Y%m%d%H%M -d "+1hour")"
date2=$(date +%Y%m%d%H%M -d "$date1 + 1hour")
# NOT WORK?
echo "$date1 --> $date2"
# WORK!
echo "$date1 --> $datenow"
我需要添加 1 小时。但是得到这样的错误:
date: invalid date `201605250925 + 1hour'
但它为datenow
工作.
如何从字符串中为自定义日期格式的用户添加小时?
一种满足命令date
期望的格式,如下所示:
2016-05-25 09:25
空格表示时间的开始,时间格式为 HH:MM。
这来自当时的国际ISO 8601,但使用空格而不是T。
如果格式是固定的,我们可以使用 bash 内部容量(除了使用的日期之外没有外部命令)来更改它,如下所示:
#!/bin/bash
d1="201605250925"
dc="${d1:0:8} ${d1:8:2}:${d1:10:2}+0"
d2=$(date +'%Y%m%d %H:%M' -ud "$dc + 1 hour" )
echo "$d2"
或POSIXly(破折号),无需调用sed,awk或剪切(更快):
#!/bin/dash
d1="201605250925"
dt=${d1##????????}
dc="${d1%%"$dt"} ${dt%%??}:${dt##??}+0"
d2=$(date -ud "$dc + 1 hour" +'%Y%m%d %H:%M')
echo "$d2"
20160525 10:25
在 dc
中的时间之后包含+0
:20160525 09:25+0
将确保date
将时间解释为偏移量 0 (UTC)。
使用迄今为止-u
的选项将确保以 UTC 读取的值也会以 UTC 格式更改,从而避免任何夏令时校正或本地时间更改。
如果你想保持与输入字符串相同的格式,你可以使用cut
或sed
来拆分它:
cut
d1="201605250925"
ds=$(echo $d1 | cut --output-delimiter=" " -c 1-8,9-12);
d2=$(date '+%Y%m%d%H%M' -ud "$ds + 1hour")
sed
d1="201605250925"
ds=$(echo $d1 | sed 's/(.*)(....)$/1 2/g');
d2=$(date '+%Y%m%d%H%M' -ud "$ds + 1hour")
这样,date
实用程序就可以理解日期和时间。
结果:
$ echo $d2
201605251025