#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