Podczas wdrażania naszego API pojawiła się kwestia czasu i stref czasowych.
Wszystkie daty są znormalizowane do UTC w bazie danych. Obecnie w aplikacji innej niż API wszystkie czasy danych są konwertowane na podstawie preferencji użytkowników, zanim zostaną przedstawione.
Teraz pojawiło się to samo pytanie dotyczące interfejsu API: czy interfejs API powinien być w stanie zwrócić datę / godzinę odpowiednią dla strefy czasowej na podstawie semantyki żądań?
Na przykład GET /posts?timezone=America/Sao_Paulo
?
A może należy to nadal robić na dowolnym kliencie uzyskującym dostęp do interfejsu API?
Aktualizacja: odkąd pojawił się kilka razy: obecnie zwracane są znaczniki czasu ze strefą czasową (chociaż zawsze jest to przesunięcie TZ +00:00
). Format to popularny 8601:2015-10-29T23:00:49+00:00
Odpowiedzi:
Powinieneś zwrócić bezwzględny punkt w czasie, wtedy każdy może zlokalizować ten znacznik czasu w razie potrzeby. Przez „absolutny znacznik czasu” rozumiem znacznik czasu UNIX lub znacznik czasu czytelny dla człowieka, który obejmuje strefę czasową w jednym ze standardowych formatów ISO, np. „2007-04-05T14: 30Z”. W razie potrzeby klient może to w prosty sposób przekształcić w lokalną strefę czasową.
Jeśli chcesz zaakceptować parametr strefy czasowej i zlokalizować znacznik czasu w tej strefie czasowej, to jest w porządku, ale nadal powinieneś używać absolutnego znacznika czasu włącznie. strefa czasowa w odpowiedzi, np. „2007-04-05T16: 30-02: 00”. Biorąc pod uwagę, że ta wartość jest identyczna z poprzednią niezlokalizowaną, dość wątpliwe jest, dlaczego mielibyście trudności z oferowaniem tego parametru. Dokładny format wyświetlania znacznika czasu jest ostatecznie zgodny z interfejsem klienta, więc prawdopodobnie i tak przetworzy wartość.
źródło
strftime
formatu (plus ustawienia regionalne, dla nazw miesięcy / dni) z tych samych powodów, dla których pierwszy klient uznał, że warto określić strefę czasową. Nawet jeśli strefa czasowa jest jedyną ustępstwem, uczyniłeś odpowiedź interfejsu API bardziej złożoną: nie jest to już tylko „znacznik czasu w tym samym formacie za każdym razem”, ale „znacznik czasu wyrażony w sposób, w jaki zostałem poproszony o jego wyrażenie”Jeśli masz już logikę konwertowania wartości daty i godziny na lokalną strefę czasową użytkownika, możesz zaoferować obie możliwości w interfejsie API.
Jeśli klient złoży takie żądanie
GET /posts
, otrzyma cały czas w domyślnej strefie czasowej (UTC).Jeśli klient złoży takie żądanie
GET /posts?timezone=America/Sao_Paul
, wówczas wszystkie czasy w odpowiedzi zostaną dostosowane do określonej strefy czasowej.To od klienta zależy, czy chce on zrobić to w strefach czasowych.
źródło
Zwykle można oczekiwać UTC od interfejsu API.
Jeśli jednak „interfejs API REST” jest tylko częścią strony po stronie serwera przy użyciu frameworku javascript. Argumentowałbym, że w rzeczywistości zwracasz ViewModel, więc powinien on zawierać zlokalizowane ciągi, liczby i czasy.
źródło
To zły, zły, zły pomysł. Rozważ sytuację, w której klient przechowuje odpowiedzi z serwera, a następnie użytkownik podróżuje do innej strefy czasowej. Teraz masz sytuację, w której ta „funkcja” w najlepszym wypadku nie da ci żadnej przewagi ani nie spowoduje ogromnych kłopotów.
BTW. Przez ile stref czasowych i ilu klientów zamierzasz to przetestować? Jeśli serwer udzieli oczekiwanej odpowiedzi dla America / Sao_Paulo, co odpowie na America / Sao_Paulo?
źródło
America/Sao_Paulo
. Wydaje mi się, że dyskusja dotyczy tego, co się stanie, jeśli nie będzie można zidentyfikować strefy czasowej; albo dlatego, że jest to po prostu źle, albo baza danych TZ jest nieaktualna (uważam, że ta ostatnia jest mało prawdopodobna w przypadku rzeczywistych nazw [ale nie w przypadku wartości przesunięcia). Jednak w obu przypadkach prawdopodobnie zwróciłbym400 BAD_REQUEST
odpowiedź.