2010-09-01 13 views
12

Jeśli mój użytkownik jest w Kalifornii i ma ustawiony komputer na PST, jest tam 13:00. Jeśli mój serwer jest ustawiony na EST, bieżący czas serwera to 16:00.Uzyskaj różnicę stref czasowych między klientem a serwerem

Potrzebuję sposobu, aby uzyskać różnicę strefy czasowej między klientem a serwerem, albo w JavaScript lub C#. W moim przykładzie otrzymam 3 (lub -3, nie ma znaczenia).

Czy ktoś wie, jak to zrobić?

EDIT: Możliwe rozwiązanie dla RedFilter

Robi to wszystko w javascript:

serverDate = new Date('<%= DateTime.Now.ToString() %>'); 
clientDate = new Date(); 
diffMin = (serverDate.getTime()-clientDate.getTime())*1000*60; //get difference in minutes 

Myśl, że będzie działać? A może obaj powrócą w tym samym czasie?

+2

Jeśli serwer jest ustawiony na EST, coś jest nie tak. Powinien działać w UTC. To usunie tak wiele bólów głowy związanych ze strefami czasowymi. –

+1

@Frederik Nie widzę, jak to naprawdę zmienia sytuację. Jeśli aplikacja musi znać przesunięcie czasowe klienta, musi wiedzieć, niezależnie od ustawienia strefy czasowej serwera. – Pointy

+0

Mój serwer działa w UTC, po prostu użyłem EST jako przykładu, aby uniknąć wszystkich odpowiedzi "istnieją funkcje do konwersji dat na UTC", które nie pomogłyby w rozwiązaniu problemu. – Steven

Odpowiedz

13

Użytkownik może:

1 - Zwraca datę serwera do klienta jako zmienną daty JavaScript.
2 - Utwórz nową stronę klienta daty javascript (var currentTime = new Date();) i odejmij powyższą datę
3 - Opublikuj wynik z powrotem na serwerze (jeśli to konieczne, być może trzeba tylko znać różnicę po stronie klienta).

Aktualizacja

Oto przykład:

serverDate = new Date('<%= DateTime.Now.ToString() %>'); 
clientDate = new Date(); 
diffMin = (serverDate.getTime()-clientDate.getTime())/(1000*60); 
alert("serverDate: " + serverDate + "\r\n" + "clientDate: " + clientDate + "\r\n" + 
    "diffMin: " + diffMin); 

Jeśli serwer i klient są na tej samej maszynie, zobaczysz diffMin zbliża się do zera. Istnieje niewielka różnica między datami ze względu na czas pomiędzy skryptem po stronie serwera generującym datę a przeglądaniem i uruchomieniem skryptu javascript.

// To była przydatna dla mnie - DateTime.Now.ToString ("yyyy-MM-DDTgg: mm: ss")

+0

Edytowałem mój oryginał, daj mi znać, jeśli uważasz, że to zadziała. – Steven

+0

@Steven: zobacz moją aktualizację – RedFilter

+0

Dziękuję, to się skończyło. – Steven

0

Dobrym sposobem sprawdzenia różnicy stref czasowych, co trzeba wiedzieć strefę czasową (lokalizacja), w którym czas jest zajęty. Jeśli możesz to uzyskać po stronie klienta i po stronie serwera, możesz sprawdzić klasę TimeZoneInfo (potrzebuje 3.5, myślę) TimeZoneInfo from Koders.

Konwersja czasu klienta i serwera z powiązaną strefą na UTC (ConvertTimeZoneToUtc) i porównanie dwóch.

+0

To jest problem, nie wiem strefy czasowej, że klient będzie nawigował, może być z dowolnego miejsca. Gdybym mógł uzyskać te informacje, to byłoby to pomocne, ale nie wiem jak. – Steven

+0

Następnie chciałbym wiedzieć, jak uzyskać czas od klienta. Ponieważ mam podobny problem i rozwiązałem go, korzystając z lokalizacji wszystkich kontaktów. Używam lokalizacji miast powiązanych ze strefą czasową. – Khan

1

Czy musisz znać strefę czasową lokalizacji lub urządzenia?

Jeśli chcesz poznać strefę czasową lokalizacji, najlepiej subskrybować usługę Geo-IP i sprawdzić adres IP, a następnie sprawdzić strefę czasową dla tej lokalizacji (dostępne są publicznie dostępne bazy danych) . Nie jest to gwarantowane, ponieważ informacje geograficzne IP nie są gwarantowane (a to zdecydowanie nie jest teoretyczny brak gwarancji, obfitujące w błędne informacje).

Często jednak naprawdę chodzi o ustawienie strefy czasowej komputera klienckiego. W przypadku większości usług uznałbym to za irytujące, gdybym podróżował i gdyby strona internetowa pomyślała o mnie, żebym był w innym czasie niż to, w którym pracowałem (trzymam się swojej strefy czasowej, jeśli długo jej nie opuszczę).

To jest łatwe do zrobienia po stronie klienta.new Date().getTimezoneOffset() zwraca liczbę minut między czasem UTC i czasem lokalnym. Na przykład. obecnie jestem w Irish Summer Time (GMT + 1 godzina czasu letniego), a on zwraca -60.

Możesz łatwo umieścić to w identyfikatorze URI używanym przez obraz lub żądanie XHR lub umieścić w wartości cookie.

Powiązane problemy