Haruskah REST API dapat mengonversi datetime ke zona waktu klien yang sesuai?

10

Saat menerapkan API kami, masalah waktu dan zona waktu muncul.

Semua tanggal dinormalisasi ke UTC dalam database. Saat ini, dalam aplikasi non-API, semua data dikonversi berdasarkan preferensi pengguna terlebih dahulu sebelum disajikan.

Sekarang pertanyaan yang sama muncul untuk API: haruskah API dapat mengembalikan waktu yang tepat untuk zona waktu berdasarkan semantik permintaan?

Misalnya GET /posts?timezone=America/Sao_Paulo?

Atau haruskah masih dilakukan pada klien apa pun yang mengakses API?

Pembaruan: sejak muncul beberapa kali: saat ini cap waktu dengan zona waktu dikembalikan (meskipun selalu TZ diimbangi +00:00). Formatnya adalah 8601 yang populer:2015-10-29T23:00:49+00:00

menandai
sumber
Jika Anda mengembalikan stempel waktu yang berisi zona waktu, klien dapat dengan mudah mengubahnya menjadi waktu lokal apa pun yang diperlukan. Bagaimanapun, pertanyaan ini sepertinya tidak berhubungan dengan REST sama sekali. Ada banyak cara Anda dapat menerapkan ini yang tidak melanggar prinsip-prinsip REST. Harap diingat bahwa mengekspos parameter ini berarti lebih banyak pekerjaan untuk Anda. Dalam arsitektur yang benar-benar tenang, Anda harus membuat tautan-tautan ini dapat ditemukan. Menurut saya ini hal yang tidak perlu rumit untuk diterapkan baik pada sisi klien maupun server.
toniedzwiedz
> Ini menurut saya hal yang tidak perlu rumit untuk diterapkan baik pada sisi klien maupun server. Terima kasih atas masukannya!
tandai

Jawaban:

17

Anda harus mengembalikan titik waktu absolut , lalu siapa pun dapat melokalkan cap waktu sesuai kebutuhan. Yang dimaksud dengan "stempel waktu absolut" yang saya maksud adalah stempel waktu UNIX atau stempel waktu yang dapat dibaca manusia yang mencakup zona waktu dalam salah satu format ISO standar, misalnya "2007-04-05T14: 30Z". Ini sepele dapat dikonversi ke zona waktu lokal oleh klien sebagaimana diperlukan.

Jika Anda ingin menerima parameter zona waktu dan melokalkan stempel waktu ke zona waktu itu tidak masalah, tetapi Anda masih harus menggunakan timestamp absolut termasuk. zona waktu dalam respons Anda, mis. "2007-04-05T16: 30-02: 00". Mengingat bahwa nilai ini identik dengan yang non-dilokalkan sebelumnya, cukup dipertanyakan mengapa Anda harus melalui kesulitan menawarkan parameter ini. Format tampilan yang tepat dari cap waktu pada akhirnya sampai ke frontend klien, sehingga kemungkinan akan memposting nilai proses lagi.

menipu
sumber
4
"Cukup dipertanyakan mengapa Anda harus melalui masalah" - jika tidak ada yang lain, itu adalah ujung tipis dari irisan. Klien berikutnya dari API ini mungkin meminta Anda untuk membiarkan mereka menentukan strftimeformat (plus lokal, untuk nama bulan / hari) untuk alasan kenyamanan yang sama dengan yang menurut klien pertama berguna untuk menentukan zona waktu. Bahkan dengan zona waktu sebagai satu-satunya konsesi, Anda telah membuat respons API Anda lebih kompleks: itu tidak lagi hanya "cap waktu dalam format yang sama setiap kali", itu "cap waktu yang diungkapkan dengan cara saya diminta untuk mengekspresikannya"
Steve Jessop
3
Persisnya, kompleksitas. Kompleksitas itu jahat. Itu membuat semua orang bekerja lebih keras tanpa ada nilai tambah pada produk atau bisnis. Kematian oleh seribu potongan kertas.
Brandon
2
> Anda harus mengembalikan poin absolut saat saya mengklarifikasi pertanyaan saya bahwa saya sudah melakukan ini. Terima kasih atas wawasan Anda!
tandai
4

Jika Anda sudah memiliki logika untuk mengonversi nilai datetime ke zona waktu lokal pengguna, Anda bisa menawarkan kedua kemungkinan di API Anda.

Jika klien membuat permintaan seperti GET /posts, maka mereka mendapatkan semua waktu di zona waktu default (UTC).
Jika klien membuat permintaan seperti GET /posts?timezone=America/Sao_Paul, maka semua waktu di balasan akan disesuaikan dengan zona waktu yang ditentukan.

Terserah implementasi klien apa yang ingin mereka lakukan dengan zona waktu.

Bart van Ingen Schenau
sumber
2

Biasanya Anda akan mengharapkan UTC dari API.

Namun, jika 'REST API' Anda hanyalah bagian sisi server dari halaman web menggunakan kerangka kerja javascript. Saya berpendapat bahwa sebenarnya Anda mengembalikan ViewModel dan karenanya harus berisi string, angka, dan waktu yang dilokalkan.

Ewan
sumber
2

Itu ide yang buruk, buruk, buruk. Pertimbangkan situasi di mana klien menyimpan respons dari server, dan kemudian pengguna melakukan perjalanan ke zona waktu yang berbeda. Sekarang Anda memiliki situasi di mana "fitur" ini paling-paling tidak akan memberi Anda keuntungan apa pun, atau menciptakan masalah besar.

BTW. Untuk berapa banyak zona waktu dan berapa banyak klien yang akan Anda uji ini? Jika server memberikan jawaban yang diharapkan untuk America / Sao_Paul, apa yang akan direspon untuk America / Sao_Paulo?

gnasher729
sumber
Itu kesalahan saya, saya memperbaikinya America/Sao_Paulo. Saya kira itu untuk diskusi apa yang terjadi jika zona waktu tidak dapat diidentifikasi; entah karena itu salah atau database TZ kedaluwarsa (saya menemukan yang terakhir tidak mungkin untuk nama sebenarnya [tetapi tidak demikian untuk nilai offset). Namun, dalam kedua kasus itu, saya mungkin akan membalasnya 400 BAD_REQUEST.
tandai