我有一个bash脚本,它应该将时间戳增加1天,以从时间戳中回显接下来的5天,但是当它运行时,它产生了错误的输出,并减去了一个小时。
脚本
#!/bin/bash
TIME_STAMP="2023-06-03 06:21:33"
for i in {1..5}
do
NEXT_DATE=$(date "+%Y-%d-%m %H:%M:%S" -d "$TIME_STAMP +$i day")
echo $NEXT_DATE
done
输出
2023-04-06 06:21:33
2023-04-06 05:21:33
2023-04-06 04:21:33
2023-04-06 03:21:33
2023-04-06 02:21:33
据我所知,日期格式是正确的,所以我完全不知道为什么它不能正常工作。如果有更简单的方法来做到这一点,我很乐意听到它!
5条答案
按热度按时间tjvv9vkg1#
问题是日期字符串被拆分,而
date
只根据时间进行计算。解决方法是拆分时间,然后在生成的日期之后将其添加回去。
将输出捕获到一个变量中,这样你就可以
echo
了,这是一个无用的echo
,但我想你希望这个变量在你的真实的用例中有更多的用途。还要注意
date -d
是不可移植的;这将在Linux上工作,但在许多其他平台上不工作。rfbsl7qr2#
字符串解析为:
添加一个
+00
,使date
将时区解析为UTC。或使用您当前的时区偏移:
sqougxex3#
我认为@KamilCuk的答案是正确的方法,如果你打算使用
date
,但这里有一个替代方案,假设你不关心DST:请参阅Correct Bash and shell script variable capitalization了解我为什么将变量名改为小写。
我强烈建议你不要使用
YYYY-DD-MM
而不是YYYY-MM-DD
或类似的格式,因为之后很难做任何事情,例如在一个范围内排序或搜索。woobm2wo4#
使用带有 * 核心模块 * 的
Perl
(默认安装),没有日期字符串的“作弊”,我猜是最便携和最强大的解决方案。wink to @艾德;)
kwvwclae5#
简单,而不是本地时区,我们可以使用
date
与-u
选项的UTC区,添加'0000'在输入时区的UTC转换