Ao implementar nossa API, surgiu o problema de data e hora e fusos horários.
Todas as datas são normalizadas para UTC no banco de dados. Atualmente, no aplicativo que não é da API, todas as datas são convertidas com base nas preferências dos usuários, antes de serem apresentadas.
Agora, surgiu a mesma pergunta para a API: a API deveria poder retornar a data / hora apropriada para um fuso horário com base na semântica da solicitação?
Por exemplo GET /posts?timezone=America/Sao_Paulo
?
Ou ainda deve ser feito em qualquer cliente que esteja acessando a API?
Atualização: desde que surgiu algumas vezes: atualmente, os carimbos de hora e fuso horário são retornados (embora seja sempre o deslocamento de TZ +00:00
). O formato é o popular 8601:2015-10-29T23:00:49+00:00
Respostas:
Você deve retornar um ponto absoluto no tempo, para que qualquer pessoa possa localizar esse carimbo de hora, conforme necessário. Por "registro de data e hora absoluto", quero dizer um registro de data e hora do UNIX ou um registro de data e hora legível por humanos, que inclui o fuso horário em um dos formatos ISO padronizados, por exemplo, "2007-04-05T14: 30Z". Isso pode ser convertido trivialmente em um fuso horário local pelo cliente, conforme necessário.
Se você deseja aceitar um parâmetro de fuso horário e localizar o registro de data e hora para esse fuso horário, tudo bem, mas você ainda deve usar o registro de data e hora absoluto incl. fuso horário na sua resposta, por exemplo, "2007-04-05T16: 30-02: 00". Dado que esse valor é idêntico ao anterior não localizado, é bastante questionável por que você enfrentaria o problema de oferecer esse parâmetro. O formato exato de exibição do registro de data e hora é, até o final, o frontend do cliente, portanto, provavelmente, o processo será pós-processado de qualquer maneira.
fonte
strftime
formato (mais localidade, para nomes de mês / dia) pelos mesmos motivos de conveniência que o primeiro cliente achou útil especificar um fuso horário. Mesmo com o fuso horário como a única concessão, você tornou a resposta da sua API mais complexa: não é mais apenas "um registro de data e hora no mesmo formato todas as vezes", é "um registro de data e hora expresso da maneira que me pediram para expressá-la"Se você já possui a lógica para converter valores de data e hora no fuso horário local do usuário, poderá oferecer as duas possibilidades em sua API.
Se um cliente faz uma solicitação como
GET /posts
, então ele recebe todos os horários no fuso horário padrão (UTC).Se um cliente fizer uma solicitação como
GET /posts?timezone=America/Sao_Paul
, todos os horários da resposta serão ajustados para o fuso horário especificado.Cabe à implementação do cliente o que eles querem fazer com os fusos horários.
fonte
Normalmente, você esperaria o UTC de uma API.
No entanto, se a sua 'API REST' for apenas a parte do servidor de uma página da Web usando uma estrutura javascript. Eu diria que, na verdade, você está retornando um ViewModel e, portanto, deve conter seqüências de caracteres localizadas, números e horas.
fonte
É uma péssima, má, má ideia. Considere uma situação em que o cliente armazena respostas do servidor e, em seguida, o usuário viaja para um fuso horário diferente. Agora você tem uma situação em que esse "recurso", na melhor das hipóteses, não lhe dará nenhuma vantagem ou criará enormes problemas.
Entre. Por quantos fusos horários e quantos clientes você testará isso? Se o servidor fornecer a resposta esperada para America / Sao_Paul, o que responderá para America / Sao_Paulo?
fonte
America/Sao_Paulo
. Acho que está em discussão o que acontece se o fuso horário não puder ser identificado; ou porque está errado ou o banco de dados TZ está desatualizado (acho improvável que o último seja para os nomes reais [mas não para os valores de deslocamento). No entanto, em ambos os casos, eu provavelmente retornaria uma400 BAD_REQUEST
resposta.