Uma API REST deve poder converter data e hora em fuso horário de clientes apropriados?

10

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

marca
fonte
Se você retornar um carimbo de data / hora contendo um fuso horário, o cliente poderá convertê-lo facilmente para o horário local necessário. De qualquer forma, esta pergunta não parece estar relacionada ao REST. Existem várias maneiras de implementar isso que não violam os princípios do REST. Lembre-se de que expor esse parâmetro significa mais trabalho para você. Em uma arquitetura verdadeiramente RESTful, você precisará tornar esses links detectáveis ​​de alguma forma. Parece-me uma coisa desnecessariamente complicada de implementar no lado do cliente e do servidor.
toniedzwiedz
> Parece-me uma coisa desnecessariamente complicada de implementar no cliente e no servidor. Obrigado pela contribuição!
marca de

Respostas:

17

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.

deceze
fonte
4
"é bastante questionável por que você enfrentaria o problema" - se nada mais, é a ponta fina da cunha. O próximo cliente desta API pode solicitar que você especifique um strftimeformato (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"
Steve Jessop
3
Exatamente, complexidade. Complexidade é má. Isso faz com que todos trabalhem mais, sem nenhum valor agregado para o produto ou negócio. Morte por mil cortes de papel.
Brandon
2
> Você deve retornar um ponto absoluto no tempo. Esclarei minha pergunta de que já estou fazendo isso. Obrigado pela sua compreensão!
marca de
4

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.

Bart van Ingen Schenau
fonte
2

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.

Ewan
fonte
2

É 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?

gnasher729
fonte
Isso foi um erro da minha parte, eu o corrigi 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 uma 400 BAD_REQUESTresposta.
marque