忍耐一下,我并不坚强bash
。我有一个日期/时间,YYYYMMDDHHMMSS
格式如20031005000000
字符串。我喜欢加上一年。我读过,man date
但解释它的内容有点困难,尽管我认为我确实对 WWW 的许多示例有基本的理解-d
和选择。-s
以下是我读过的许多内容中的一些:
- https://stackoverflow.com/questions/46411970/add-x-days-to-a-pspecial-date-in-bash
- https://stackoverflow.com/questions/25619923/bash-convert-date-to-timestamp
- https://stackoverflow.com/questions/18706823/how-to-increment-a-date-in-a-bash-script
所以目前,我知道如何在当前日期上添加一年。
myDatePlusOneYr=$(date -d "+365 days" '+%Y%m%d%H%M%S')
我可以添加one year
到日期而无需时间段(HHMMSS)。
myDate="20031005"
date -d "$myDate +365 day"
Mon Oct 4 00:00:00 GMT 2004
但是我还没有找到将一年添加到日期/时间格式的方法。当我尝试使用具有时间段的第二个选项时,我收到以下错误消息。
date: invalid date `20031005000000 +365 day'
我注意到backtick
日期/时间的开头和single quote
结尾。我不知道如何解释错误消息。我很感激你的建议。
更新:我找到了以下问题的答案invalid date
:https://stackoverflow.com/questions/4197606/how-to-convert-yyyymmddhhmmss-to-a-date-readable-by-date
答案1
我可能过于简单化了,但是:
% expr 20091005000000 + 10000000000
20101005000000
答案2
您可以将字符串视为数字:
#/bin/sh
date='20000229000000'
echo "$((date + 10000000000))"
打印20041005000000
.当然,如果您的日期恰好是闰年的 2 月 29 日,它就无法正常工作,但这应该是唯一的例外。您可以通过将字符串分成几部分并将闰日作为特殊情况来处理这个问题:
#!/bin/bash
date='20000229000000'
# assume it's correctly formatted
y=${date:0:4}
m=${date:4:2}
d=${date:6:2}
t=${date:8}
if [[ $m == 02 && $d == 29 ]]; then
m=03
d=01
fi
echo "$((y+1))$m$d$t"
在某些 shell(包括 Bash)中,算术将以零开头的数字视为八进制,但我们只对年份进行算术运算,并且它不应该有前导零。
答案3
我不喜欢这个答案,因为它调用 3 个 shell 命令来完成它,但它有效。从...开始myDate="20031005010203"
我假设您希望在此基础上再增加一年。丑陋的做法是拆开,将前8个字符视为YYYYMMDD,添加年份,并使用date命令格式化结果。它将时间缝合回时间值。请注意,对于我的测试数据,我使用 20040229(有效的闰年)。
myDate="20040229010203"
datebit=$(echo $myDate | cut -c 1-8)
timebit=$(echo $myDate | cut -c 9-)
newdate=$(date -d "$datebit +1 year" +"%Y%m%d${timebit}")
echo "${newdate}"
输入是20040229010203
,输出应该是20050301010203
。
因此,“从 2004 年 2 月 29 日 01:02:03 开始的一年”是“2005 年 3 月 1 日 01:02:03”
我在 ubuntu 上使用标准date
命令对此进行了测试。