如何将添加小时用于自定义日期



我有一个来自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 中的时间之后包含+020160525 09:25+0
将确保date将时间解释为偏移量 0 (UTC)。

使用迄今为止-u的选项将确保以 UTC 读取的值也会以 UTC 格式更改,从而避免任何夏令时校正或本地时间更改。

如果你想保持与输入字符串相同的格式,你可以使用cutsed来拆分它:

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

相关内容

  • 没有找到相关文章

最新更新