При реализации нашего API возникла проблема даты и времени.
Все даты нормализованы к UTC в базе данных. В настоящее время в приложении без API все даты и время конвертируются на основе предпочтений пользователей, прежде чем они представлены.
Теперь тот же вопрос возник для API: должен ли API возвращать дату и время, подходящие для часового пояса, на основе семантики запроса?
Например GET /posts?timezone=America/Sao_Paulo
?
Или это должно быть сделано на клиенте, который обращается к API?
Обновление: поскольку оно появлялось несколько раз: в настоящее время возвращаются метки времени с часовым поясом (хотя это всегда смещение TZ +00:00
). Формат популярный 8601:2015-10-29T23:00:49+00:00
Ответы:
Вы должны вернуть абсолютный момент времени, тогда любой может локализовать эту временную метку по мере необходимости. Под «абсолютной меткой времени» я подразумеваю либо метку времени UNIX, либо метку времени, удобную для чтения человеком, которая включает часовой пояс в одном из стандартизированных форматов ISO, например, «2007-04-05T14: 30Z». При необходимости клиент может преобразовать его в местный часовой пояс.
Если вы хотите принять параметр часового пояса и локализовать временную метку для этого часового пояса, это нормально, но вы все равно должны использовать абсолютную временную метку, вкл. часовой пояс в вашем ответе, например, "2007-04-05T16: 30-02: 00". Учитывая, что это значение идентично предыдущему нелокализованному, довольно сомнительно, почему вы столкнулись с проблемой предложения этого параметра. Точный формат отображения метки времени, в конечном счете, зависит от клиентского интерфейса, так что, скорее всего, он все равно постобработает значение.
источник
strftime
формат (плюс языковой стандарт для названий месяцев / дней) по тем же причинам, по которым первый клиент счел полезным указать часовой пояс. Даже когда часовой пояс является единственной уступкой, вы сделали ответ своего API более сложным: это больше не просто «отметка времени в одном и том же формате каждый раз», а «отметка времени, выраженная в том виде, в котором меня попросили выразить это»Если у вас уже есть логика для преобразования значений даты и времени в местный часовой пояс пользователя, вы можете предложить обе возможности в своем API.
Если клиент делает запрос как
GET /posts
, то он получает все время в часовом поясе по умолчанию (UTC).Если клиент делает запрос как
GET /posts?timezone=America/Sao_Paul
, то все время в ответе будет настроено на указанный часовой пояс.Затем клиентская реализация должна делать то, что они хотят делать с часовыми поясами.
источник
Обычно вы ожидаете UTC от API.
Однако, если ваш «REST API» - это только часть веб-страницы на стороне сервера, использующая инфраструктуру javascript. Я бы сказал, что на самом деле вы возвращаете ViewModel, и он должен содержать локализованные строки, числа и время.
источник
Это плохая, плохая, плохая идея. Рассмотрим ситуацию, когда клиент хранит ответы с сервера, а затем пользователь перемещается в другой часовой пояс. Теперь у вас есть ситуация, когда эта «функция» в лучшем случае не даст вам никаких преимуществ или создаст огромные проблемы.
КСТАТИ. Сколько часовых поясов и сколько клиентов вы собираетесь проверить это? Если сервер даст ожидаемый ответ для Америки / Sao_Paul, что он ответит для Америки / Sao_Paulo?
источник
America/Sao_Paulo
. Я думаю, что это для обсуждения, что произойдет, если часовой пояс не может быть идентифицирован; либо потому, что это неверно, либо база данных TZ устарела (я нахожу последнее маловероятным для реальных имен [но не для значений смещения). Однако в любом случае я бы, вероятно, вернул400 BAD_REQUEST
ответ.