Re: разработка API для просмотра IPTV сервиса Rodnoe.TV (обсуждение/предложения)
у нас взаимное непонимание
я твержу о том, что unixtime есть во всех языках, но
но "чистый юникстайм" будет только в случае если я и вы его будем конвертить в строку и из строки без учета таймзоны.
Т.е. возьмем к примеру одну передачу из ЕПГ.
Она начинается теплым майским днем (например 1 мая ) в 12:00 по Москве. Часовой пояс +3.
Клиент сидит во Франкфурте в часовом поясе +1 ну и еще +1 час летнего временного сдвига, итого = +2 часа (что у него в аккаунте и занесено: "зона +1", "учитывать летний сдвиг" ).
Я хочу вернуть время ее начала уже готовое КЛИЕНТСКОЕ, взяв клиентские настройки из базы.
Как я это сделаю в случае строкового времени
Возьму время начала передачи, приведенное к Гринвичу (UTC|GMT),
получаем 9:00 UTC
добавлю таймзону клиента и его летний сдвиг времени.
получаем 11:00 .
Итого:
в базе в ЕПГ "2011-05-01 12:00:00"
клиенту отдано строковое "2011-05-01 11:00:00"
Никаких коррекций от клиентской части не требуется, возможность ошибок минимальна
Вариант таймстампа
Ну все то же что и для строкового.
Дополнительно надо упаковать дату в юникстайм.
Если делать это стандартными средствами, то получим юникстайм с учетом серверной таймзоны.
Допустим сервер находится в часовом поясе +4 без летнего времени (это для наглядности, вообще-то неважно, пусть даже в зоне UTC).
Если я тупо конвертну стандартным например php::time() либо postgresql::extract_epoch(), то получу не количество секунд в разнице "2011-05-01 11:00:00" - "1970-01-01 00:00:00", а количество секунд от этой разницы да еще минус секунды таймзоны и летнего сдвига (в данном случае - 3600*4).
Т.е. при обратной конвертации в строку (а это необходимо) клиентское приложение должно учесть таймзону с которой происходила упаковка, иначе клиент получит "2011-05-01 09:00:00"
Итого:
в базе в ЕПГ "2011-05-01 12:00:00"
клиенту отдано вместо строкового "2011-05-01 11:00:00" интовое, конвертируемое в "2011-05-01 09:00:00"
ВЫХОД
1) использовать в АПИ только строковое представление дат.
2) паковать в юникстайм не клиентское время а его "отражение на UTC", т.е. в нашем примере не "2011-05-01 11:00:00" а "2011-05-01 09:00:00" ("2011-05-01 11:00:00" минус 2 часа таймзоны).
Тогда распаковщик учтет таймзону на клиенте (вы сможете в приставках или программах ее получать? Или опять же будете тащить ее из базы?) и распакует ее в строку "2011-05-01 11:00:00" (т.е. в то что нужно, но это путь "через горы и леса и еще немножко полем"
Но SERVERTIME в ответе так отдавать бессмісленно.
у нас взаимное непонимание
я твержу о том, что unixtime есть во всех языках, но
но "чистый юникстайм" будет только в случае если я и вы его будем конвертить в строку и из строки без учета таймзоны.
Т.е. возьмем к примеру одну передачу из ЕПГ.
Она начинается теплым майским днем (например 1 мая ) в 12:00 по Москве. Часовой пояс +3.
Клиент сидит во Франкфурте в часовом поясе +1 ну и еще +1 час летнего временного сдвига, итого = +2 часа (что у него в аккаунте и занесено: "зона +1", "учитывать летний сдвиг" ).
Я хочу вернуть время ее начала уже готовое КЛИЕНТСКОЕ, взяв клиентские настройки из базы.
Как я это сделаю в случае строкового времени
Возьму время начала передачи, приведенное к Гринвичу (UTC|GMT),
получаем 9:00 UTC
добавлю таймзону клиента и его летний сдвиг времени.
получаем 11:00 .
Итого:
в базе в ЕПГ "2011-05-01 12:00:00"
клиенту отдано строковое "2011-05-01 11:00:00"
Никаких коррекций от клиентской части не требуется, возможность ошибок минимальна
Вариант таймстампа
Ну все то же что и для строкового.
Дополнительно надо упаковать дату в юникстайм.
Если делать это стандартными средствами, то получим юникстайм с учетом серверной таймзоны.
Допустим сервер находится в часовом поясе +4 без летнего времени (это для наглядности, вообще-то неважно, пусть даже в зоне UTC).
Если я тупо конвертну стандартным например php::time() либо postgresql::extract_epoch(), то получу не количество секунд в разнице "2011-05-01 11:00:00" - "1970-01-01 00:00:00", а количество секунд от этой разницы да еще минус секунды таймзоны и летнего сдвига (в данном случае - 3600*4).
Т.е. при обратной конвертации в строку (а это необходимо) клиентское приложение должно учесть таймзону с которой происходила упаковка, иначе клиент получит "2011-05-01 09:00:00"
Итого:
в базе в ЕПГ "2011-05-01 12:00:00"
клиенту отдано вместо строкового "2011-05-01 11:00:00" интовое, конвертируемое в "2011-05-01 09:00:00"
ВЫХОД
1) использовать в АПИ только строковое представление дат.
2) паковать в юникстайм не клиентское время а его "отражение на UTC", т.е. в нашем примере не "2011-05-01 11:00:00" а "2011-05-01 09:00:00" ("2011-05-01 11:00:00" минус 2 часа таймзоны).
Тогда распаковщик учтет таймзону на клиенте (вы сможете в приставках или программах ее получать? Или опять же будете тащить ее из базы?) и распакует ее в строку "2011-05-01 11:00:00" (т.е. в то что нужно, но это путь "через горы и леса и еще немножко полем"
Но SERVERTIME в ответе так отдавать бессмісленно.
Комментарий