给定开始日期,我将日期设置为上一年的月末,然后尝试使用bash while循环循环12m。
以下循环永不退出,日期最终会从月末跳到下一个月的开头。
startdate="2014-06-22"
cod=${startdate:0:7}-01
echo $cod
cod=$( date --date "$cod -1 year +1 month -1 day " +"%Y-%m-%d" )
echo "$cod , $startdate "
while [ "$cod" < "$startdate" ];
do
echo $cod
cod=$( date --date "$cod +1 month" +"%Y-%m-%d" )
echo $cod
done
我期待的是
2013-06-30
2013-07-31
2013-08-31
2013-09-30
2013-10-31
2013-11-30
2013-12-31
2014-01-31
2014-02-28
2014-03-31
2014-04-30
2014-05-31
答案 0 :(得分:2)
所以你想要的是每个月的最后一天,但你想通过第一个“月末的最后一天”并每次增加一个月来获得它。这不起作用,因为你得到1月30日然后3月2日而不是2月28日,因为2月很奇怪,“1个月”很奇怪: - )
$ date -d '2014-01-30'
Thu Jan 30 00:00:00 GMT 2014
$ date -d '2014-01-30 +1 month'
Sun Mar 2 00:00:00 GMT 2014
要获得每个月的最后一天,您需要重复在第一个日期使用的技巧 - 找到下个月的第一天,然后是-1天。
#!/bin/bash
startdate="2014-06-22"
cod=${startdate:0:7}-01
cod=$( date --date "$cod -1 year +1 month -1 day " +"%Y-%m-%d" )
for i in $(seq 1 12); do
echo $cod
cod=$( date --date "$(date --date "$cod +32 day" +"%Y-%m-01") -1 day" +"%Y-%m-%d" )
done
哪个输出:
$ ./twelve_months.sh
2013-06-30
2013-07-31
2013-08-31
2013-09-30
2013-10-31
2013-11-30
2013-12-31
2014-01-31
2014-02-28
2014-03-31
2014-04-30
2014-05-31
请注意,我还使用逻辑检查将循环更改为直接1 .. 12
而不是while循环。当你知道你总是想要十二个日期时,while循环似乎不必要地复杂化了。
答案 1 :(得分:1)
<
正在被shell执行。您需要将其转义或使用[[
关键字进行词典比较。
while [ "$cod" \< "$startdate" ];
或
while [[ "$cod" < "$startdate" ]];
答案 2 :(得分:0)
我认为你不能比较日期字符串,但我相信你可以将日期字符串转换为纪元并将它们作为整数进行比较
纪元是自1/1/1970 00:00:00+000
示例:
startdate="2014-06-22"
epoch_start=$(date -d "$startdate" +%s)
cod=$startdate
cod=$( date --date "$cod -1 year +1 month -1 day " +%s )
while [ "$cod" -lt "$epoch_start" ];
do
date=$(date -d "@${cod}" +%Y-%m-%d)
date -d "@${cod}" +%Y-%m-%d
cod=$(date --date "${date} +1 month" +%s)
done
date -d "@${cod}" +%Y-%m-%d
输出:
bash test4.sh
2013-07-21
2013-08-21
2013-09-21
2013-10-21
2013-11-21
2013-12-21
2014-01-21
2014-02-21
2014-03-21
2014-04-21
2014-05-21
2014-06-21
2014-07-21
我希望能帮助你。