¿Debería una API REST poder convertir datetime a la zona horaria de clientes adecuada?

10

Al implementar nuestra API, surgió el problema de fecha y hora y zonas horarias.

Todas las fechas están normalizadas a UTC en la base de datos. Actualmente, en la aplicación que no es API, todas las fechas y horas se convierten según las preferencias de los usuarios antes de presentarse.

Ahora surgió la misma pregunta para la API: ¿debería la API poder devolver la fecha y hora apropiada para una zona horaria basada en la semántica de solicitud?

Por ejemplo GET /posts?timezone=America/Sao_Paulo?

¿O debería hacerse en cualquier cliente que esté accediendo a la API?

Actualización: ya que apareció varias veces: actualmente se devuelven las marcas de tiempo con la zona horaria (aunque siempre es el desplazamiento TZ +00:00). El formato es el popular 8601:2015-10-29T23:00:49+00:00

marca
fuente
Si devuelve una marca de tiempo que contiene una zona horaria, el cliente puede convertirla fácilmente a la hora local necesaria. De todos modos, esta pregunta no parece estar relacionada con REST en absoluto. Existen numerosas formas de implementar esto que no violan los principios de REST. Tenga en cuenta que exponer este parámetro significa más trabajo para usted. En una arquitectura verdaderamente RESTful, necesitará hacer que estos enlaces sean reconocibles de alguna manera. Me parece algo innecesariamente complicado de implementar tanto en el lado del cliente como del servidor.
toniedzwiedz 01 de
> Me parece algo innecesariamente complicado implementar tanto en el lado del cliente como del servidor. ¡Gracias por el aporte!
marca el

Respuestas:

17

Debe devolver un punto absoluto en el tiempo, luego cualquiera puede localizar esa marca de tiempo según sea necesario. Por "marca de tiempo absoluta" me refiero a una marca de tiempo UNIX o una marca de tiempo legible por humanos que incluye la zona horaria en uno de los formatos ISO estandarizados, por ejemplo, "2007-04-05T14: 30Z". El cliente puede convertirlo trivialmente en una zona horaria local según sea necesario.

Si desea aceptar un parámetro de zona horaria y localizar la marca de tiempo en esa zona horaria está bien, pero aún debe usar la marca de tiempo absoluta incl. zona horaria en su respuesta, por ejemplo, "2007-04-05T16: 30-02: 00". Dado que este valor es idéntico al anterior no localizado, es bastante cuestionable por qué pasaría por la molestia de ofrecer este parámetro. El formato de visualización exacto de la marca de tiempo depende en última instancia de la interfaz del cliente, por lo que es probable que procese el valor de todos modos.

difunto
fuente
44
"es bastante cuestionable por qué pasarías por el problema" - si nada más, es el extremo delgado de la cuña. El próximo cliente de esta API podría pedirle que le permita especificar un strftimeformato (más la configuración regional, para los nombres de mes / día) por las mismas razones de conveniencia que el primer cliente consideró útil especificar una zona horaria. Incluso con la zona horaria como la única concesión, ha hecho que la respuesta de su API sea más compleja: ya no es solo "una marca de tiempo en el mismo formato cada vez", es "una marca de tiempo expresada en la forma en que se me pidió que la expresara"
Steve Jessop
3
Exactamente, complejidad. La complejidad es malvada. Hace que todos trabajen más sin ningún valor agregado para el producto o negocio. Muerte por mil recortes de papel.
Brandon
2
> Deberías devolver un punto absoluto en el tiempo. Aclaré mi pregunta de que ya estoy haciendo esto. Gracias por tu perspicacia!
marca el
4

Si ya tiene la lógica para convertir los valores de fecha y hora a la zona horaria local del usuario, podría ofrecer ambas posibilidades en su API.

Si un cliente hace una solicitud como GET /posts, entonces obtiene todos los tiempos en la zona horaria predeterminada (UTC).
Si un cliente hace una solicitud como GET /posts?timezone=America/Sao_Paul, entonces todos los tiempos en la respuesta se ajustarán a la zona horaria especificada.

Depende de la implementación del cliente lo que quieren hacer con las zonas horarias.

Bart van Ingen Schenau
fuente
2

Usualmente esperarías UTC de una API.

Sin embargo, si su 'API REST' es solo la parte del servidor de una página web que utiliza un marco javascript. Yo diría que, de hecho, está devolviendo un ViewModel y, por lo tanto, debe contener cadenas localizadas, números y horas.

Ewan
fuente
2

Es una mala, mala, mala idea. Considere una situación en la que el cliente almacena las respuestas del servidor y luego el usuario viaja a una zona horaria diferente. Ahora tiene una situación en la que esta "característica" en el mejor de los casos no le dará ninguna ventaja, o creará enormes problemas.

Por cierto. ¿Para cuántas zonas horarias y cuántos clientes vas a probar esto? Si el servidor da la respuesta esperada para America / Sao_Paul, ¿qué responderá para America / Sao_Paulo?

gnasher729
fuente
Eso fue un error de mi parte, lo corregí America/Sao_Paulo. Supongo que está en discusión qué sucede si no se puede identificar la zona horaria; ya sea porque es simplemente incorrecto o porque la base de datos TZ está desactualizada (creo que este último es poco probable para los nombres reales [pero no así para los valores de desplazamiento]. Sin embargo, en cualquier caso, probablemente devolvería una 400 BAD_REQUESTrespuesta.
Marque el