Я хочу добавить счетчик и добавить 70 в эту дату 20180101 пример, когда счетчик больше 31 добавить 70 в дату 20180101 еще - PullRequest
0 голосов
/ 06 мая 2019

Я настраиваю добавить счетчик в моем сценарии оболочки и добавить 70 в этой дате. 20180101 пример, когда счетчик больше 31, добавить 70 в дату 20180101, иначе j + 1. когда мы добавим 70, 20180201 снова добавит 70, когда счетчик> 31.

j=20180101
while [ $j -le 181231 ]
    do

            fi
j=$(( j + 1 )) #increase number by 1

 done

1 Ответ

1 голос
/ 06 мая 2019

Если вы хотите циклически повторять набор дат, вы не должны рассматривать их как целые числа, а как фактические даты.Даже если ваша строка даты имеет формат YYYYMMDD и выглядит как число, она не выполняет те же операции, что и число.Как вы указываете, у вас возникают проблемы, когда вы хотите увеличить дополнительный день, когда вы находитесь в последний день месяца или, что еще хуже, в последний день года:

20190131 -> 20190201
20190228 -> 20190301
20190430 -> 20190501
20193112 -> 20200101

Но все становитсядействительно раздражает, когда вы учитываете високосные годы:

20190228 -> 20190301
20200228 -> 20200229

Таким образом, вы можете настроить сложную систему, которая отслеживает все эти вещи, такие как:

days_in_month=(x 31 28 31 30 31 30 31 31 30 31 30 31)
day=20180101
while (( day < 20181231 )); do
    # start with incrementing day:
    yyyy=${day:0:4}; mm=${day:4:2}; dd=${day:6:2}
    if (( dd < ${days_in_month[$mm]} )); then
       (( day++ ))
    elif (( mm == 2 && (yyyy%400 == 0 || (yyyy%100 != 0 && yyyy%4 == 0)) )); then
         (( day++ ))
    elif (( mm < 12 )); then
       dd="01"; (( mm++ )); day="${yyyy}${mm}01"
    else
       (( yyyy++ )); day="${yyyy}0101"
    fi
    # do your stuff
done

или вы можетепросто будь проще:

day=20180101
while (( day < 20181231 )); do
    # start with incrementing day:
    tmp=${day:0:4}-${day:4:2}-${day:6:2}
    day=$(date -d "$tmp + 1 day" "+%F")
    # do your stuff

done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...