LINUX.ORG.RU

bash Вычитание времени

 ,


0

1

Вобщем вопрос, почему данный код откуда-то берет 3 лишних часа (проверялось где-то в 16:15)?

date1=$(date -d 16:40:00 +"%s")
date2=$(date +"%s")
diff=$(($date1-$date2))
echo "$(date -d @$diff +"%H часов %M Минут %S секунд")"

Потому что в момент начала эпохи (0) в Москве было уже три часа утра. Хотя да, неверно, должно быть четыре часа ибо тогда было зимнее время.

anonymous
()
Ответ на: комментарий от RiseOfDeath

А как правильно?

Смотря какая у тебя задача.

Может хватит -u, а может и не всегда.

data -u -d @$diff +"%H часов %M Минут %S секунд"

sdio ★★★★★
()
Ответ на: комментарий от sdio

Задача получить количество времени, оставшееся до определенного момента времени. Глобально - вывести это в коньках и, поскольку гугл не подсказал иного решения, кроме exec (луа и питон в расчет не беру, ибо вообще ими не владею), я собираюсь вычислять это вот как-то так.

RiseOfDeath ★★★★
() автор топика
Последнее исправление: RiseOfDeath (всего исправлений: 1)
1. date1=$(date -d 16:40:00 +"%s")
2. date2=$(date +"%s")

1. тут время отсчитывается по часовому поясу

2. а тут по UTC пруф:

$ date -d@0
Чт янв  1 03:00:00 MSK 1970

emulek
()
Ответ на: комментарий от RiseOfDeath

Задача получить количество времени, оставшееся до определенного момента времени.

ВСЕГДА используй UTC.

emulek
()
Ответ на: комментарий от emulek

Ну у меня были такие подозрения, но что-то я из хелпа не сильно понял как принудительно задать нужный часовой пояс?

RiseOfDeath ★★★★
() автор топика
Последнее исправление: RiseOfDeath (всего исправлений: 1)
Ответ на: комментарий от RiseOfDeath

ну тебе же сказали. Вот, процитирую man date, мне не сложно:

-u, --utc, --universal print or set Coordinated Universal Time

emulek
()
Ответ на: комментарий от RiseOfDeath

и да, переводить ИЗ UTC нужно тогда, и только тогда, когда ты это хочешь показать юзеру. Вот тогда бери его $TZ, и показывай.

emulek
()
<?php
   $time = '2014-02-01 16:40';
   $datetime1 = date_create($time,new DateTimeZone('Europe/Moscow'));
   $datetime2 = date_create('now',new DateTimeZone('Europe/Moscow'));
   $interval = date_diff($datetime1, $datetime2);
   echo $interval->format('%y %m %d %h %i');
?>
Allakka ★★★★
()
Ответ на: комментарий от RiseOfDeath

да не

php и в консоли работает

но да, как-то слишком излишне

ii343hbka ★★★
()
Ответ на: комментарий от Allakka

ну вот и пхп говнокодеры подтянулись...

ну зачем ты к Europe/Moscow кастуешь? Сложно в UTC? Тебе ли не пофиг? Что, в UTC глючит? Дык потому и глючит, что на локалхосте время по localtime ставится, а в продакшене ВСЕГДА по UTC.

emulek
()
Ответ на: комментарий от RiseOfDeath

Во, вроде бы то, что надо.

на всякий случай:

а может и не всегда.

так, на будущее...

emulek
()
Ответ на: комментарий от emulek

Копипаста не моя. Однажды тоже понадобилось посчитать разницу между датами, date не смог осилить, нашёл этот код.

Allakka ★★★★
()
Ответ на: комментарий от Allakka

В данной задаче разница по времени всегда не более суток. (даже меньше).

(как это ни забавно - просто в коньках вывожу сколько до конца рабочего дня осталось)

RiseOfDeath ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.