Минуты цикла и эхо-сигнал с помощью bash

#bash #date

#bash #Дата

Вопрос:

Я хочу повторить все минуты за месяц (целью будет создание файла CSV).

Но когда я пытаюсь это:

 d="2016-09-01 00:00:00"
 while [ "$d" != "2016-09-30 00:00:00" ]; do
 echo $d 
 d=$(date --utc " %Y-%m-%d %H:%M:00" -d "$d   1 minute" )
done
 

Увеличиваются как часы, так и минуты:

 2016-09-01 00:00:00
2016-09-01 01:01:00
2016-09-01 02:02:00
2016-09-01 03:03:00
2016-09-01 04:04:00
2016-09-01 05:05:00
2016-09-01 06:06:00
2016-09-01 07:07:00
2016-09-01 08:08:00
 

Что я делаю не так и как правильно зацикливать минуты?

Комментарии:

1. Интересно, что когда я запускаю этот код, час уменьшается , а минута увеличивается. В каком часовом поясе вы находитесь? Я подозреваю --utc , что это относится только к выходным данным, а не к арифметике даты.

2. Да, знак работает не так, как думают люди. Попробуйте просто minute или просто minute и просто 1 . добавляет смещение по времени. Не используйте , просто поставьте приращение, например, после $d 10 minutes

Ответ №1:

Вместо этого я бы работал с временными метками Unix.

 d=$(date --utc  %s -d "2016-09-01 00:00:00")
end=$(date --utc  %s -d "2016-09-30 00:00:00")
while [ "$d" != "$end" ]; do
    date --utc " %Y-%m-%d %H:%M:00" -d "@$d"
    d=$(( d   60 ))
done
 

Ответ №2:

Вы можете добавить часовой UTC пояс после вашей строковой переменной date $d , чтобы получить правильный вывод:

 d="2016-09-01 00:00:00"
for ((i=0; i<=60; i  )); do
   date --utc -d "$d UTC   $i minute"
done

Thu Sep  1 00:00:00 UTC 2016
Thu Sep  1 00:01:00 UTC 2016
Thu Sep  1 00:02:00 UTC 2016
Thu Sep  1 00:03:00 UTC 2016
Thu Sep  1 00:04:00 UTC 2016
Thu Sep  1 00:05:00 UTC 2016
...
...
Thu Sep  1 00:55:00 UTC 2016
Thu Sep  1 00:56:00 UTC 2016
Thu Sep  1 00:57:00 UTC 2016
Thu Sep  1 00:58:00 UTC 2016
Thu Sep  1 00:59:00 UTC 2016
Thu Sep  1 01:00:00 UTC 2016
 

Обратите внимание на использование UTC after $d .

Ответ №3:

Использование после компонента времени в строке даты используется для «коррекции часового пояса«, а не для выполнения того, что вы хотите сделать. Интересно, что инвертирование даты и времени работает:

 $ date  " %Y-%m-%d %H:%M:00" -d "21:31:00 2016-09-03   1 minute  "
2016-09-03 21:32:00
 

в то время как наоборот, беспорядок с часовыми поясами и смещениями, поэтому результат может зависеть от вашей локальной конфигурации:

 $ TZ=Europe/London date  " %Y-%m-%d %H:%M:00" -d "2016-09-03 21:32:00   1 minute "
2016-09-03 21:33:00
$ TZ=Europe/Brussels date  " %Y-%m-%d %H:%M:00" -d "2016-09-03 21:32:00   1 minute "
2016-09-03 22:33:00
$ TZ=Asia/Singapore date  " %Y-%m-%d %H:%M:00" -d "2016-09-03 21:32:00   1 minute "
2016-09-04 04:33:00