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
Jawaban:
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.
sumber
strftime
format (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"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.
sumber
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.
sumber
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?
sumber
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 membalasnya400 BAD_REQUEST
.