2008-11-08 20 views
23

Podczas korzystania z DateTime.Now otrzymuję datę i godzinę z punktu widzenia serwera. Czy istnieje sposób, aby uzyskać klienta datę i godzinę w ASP.NET?Jak uzyskać datę i godzinę klienta w środowisku ASP.NET?

+0

JavaScript może być zły, ponieważ wielu użytkowników ma nieprawidłowy czas. Co więcej, ktoś mógłby go wykorzystać. Musisz sprawdzić, czy przesunięcie do UTC jest uzasadnione, czy nie. – hangy

Odpowiedz

11

Co mogę zrobić, to utworzyć ukryte pole wejściowe, a następnie podłączyć procedurę JavaScript do zdarzenia onsubmit dla formularza. Ta procedura zapełni pole ukryte czasem na komputerze klienta.

Ukryte pole może być używane z ASP.NET przy użyciu kontrolki HTML "HtmlInputHidden" klasy. Po prostu dajesz kontrolę wejściową atrybutu runat = "server", jak każdy inny kontroler po stronie serwera.

Serwer może następnie odczytać ten czas, gdy formularz zostanie odesłany. Możesz nawet zawinąć to w kontrolę serwera, jeśli musisz to zrobić w wielu miejscach.

Alternatywnie można to zrobić w AJAX, ale implementacja będzie zależała od używanej biblioteki.

+2

Zamiast robić to wszystko, wystarczy użyć Javascript, aby ustawić plik cookie, przechowując strefę czasową przeglądarki. Wtedy serwer może przeczytać to ciasteczko kiedykolwiek. –

+0

Problem z plikiem cookie polega na tym, że ludzie podróżują. –

4

Jeśli utrzymujesz profil użytkownika, możesz poprosić go o wskazanie strefy czasowej, a następnie wykonać niezbędne obliczenia.

0

Alternatywą jest geolokalizacja użytkownika na podstawie jego/jej adresu IP. Lub geolokacja, jeśli przeglądarka ma taką możliwość (już wkrótce w Firefoksie). Po znalezieniu lokalizacji użytkownika możesz sprawdzić strefę czasową.

Rozwiązanie javascript jest prawdopodobnie dobrym i łatwym rozwiązaniem.

+2

Adres IP niekoniecznie musi zawierać poprawną odpowiedź. Mam klienta, który korzysta z pojedynczej witryny dla wszystkich połączeń sieciowych (bezpośrednie przesyłanie z jednej witryny do drugiej), więc wszystkie pochodzą z CST IP, niezależnie od tego, gdzie faktycznie się znajdują. –

+0

Stephen: Robimy biznes, aby ukryć adresy IP klientów, więc VPN-in jest w Pradze, a proxy-out w Berlinie. A klienci są na przykład w Moskwie. – abatishchev

0

Klient i serwer mogą nie być w pełni zsynchronizowane, więc pytanie brzmi, czy chcesz mieć czas na komputerze klienckim, czy chcesz mieć czas na serwerze, ale dostosować go do różnic strefy czasowej. JavaScript może dać ci czas na kliencie (w tym strefie czasowej). Możesz także połączyć czas na serwerze ze strefą czasową klienta.

Jednak nigdy nie można uzyskać czasu z większą precyzją niż czas opóźnienia żądania.

16

Podoba mi się pomysł korzystania z przeglądarki/czasu systemowego i strefy czasowej lub pozwalania im wybrać swoją strefę czasową. W poprzednim projekcie Kiedyś coś takiego:

<script language="javascript"> 
function checkClientTimeZone() 
{ 
    // Set the client time zone 
    var dt = new Date(); 
    SetCookieCrumb("ClientDateTime", dt.toString()); 

    var tz = -dt.getTimezoneOffset(); 
    SetCookieCrumb("ClientTimeZone", tz.toString()); 

    // Expire in one year 
    dt.setYear(dt.getYear() + 1); 
    SetCookieCrumb("expires", dt.toUTCString()); 
} 

// Attach to the document onload event 
checkClientTimeZone(); 
</script> 

a następnie na serwerze:

/// <summary> 
/// Returns the client (if available in cookie) or server timezone. 
/// </summary> 
public static int GetTimeZoneOffset(HttpRequest Request) 
{ 
    // Default to the server time zone 
    TimeZone tz = TimeZone.CurrentTimeZone; 
    TimeSpan ts = tz.GetUtcOffset(DateTime.Now); 
    int result = (int) ts.TotalMinutes; 
    // Then check for client time zone (minutes) in a cookie 
    HttpCookie cookie = Request.Cookies["ClientTimeZone"]; 
    if (cookie != null) 
    { 
     int clientTimeZone; 
     if (Int32.TryParse(cookie.Value, out clientTimeZone)) 
      result = clientTimeZone; 
    } 
    return result; 
} 

Albo można przekazać go jako parametr URL i obsługiwać go w Page_Load:

http://host/page.aspx?tz=-360 

Pamiętaj tylko, aby używać minut, ponieważ nie wszystkie strefy czasowe są całymi godzinami.

+0

ten wiersz nie jest wyraźny Int32.TryParse (cookie.Value, out result); przechowujesz wartość cookie w zmiennej wynikowej, ale przed rozpoczęciem przechowywania całkowitej minuty do zmiennej wynikowej. niezbyt wyraźnie wyczyść rutynową funkcję GetTimeZoneOffset() po stronie serwera. jeśli to możliwe, wyjaśnij plzz. – Thomas

+0

@Thomas Zacząłem od strefy czasowej serwera, a następnie sprawdzam, czy istnieje plik strefy czasowej klienta. Jeśli plik cookie istnieje, spróbuj przekształcić ciąg znaków w liczby całkowite. – Ryan

-5

użyłem tej metody w ASP.Net z VB

Dim strLanguage As String = Request.UserLanguages(0) 
Dim currentCulture As CultureInfo = CultureInfo.CreateSpecificCulture(strLanguage) 
Dim dateformat As String = currentCulture.DateTimeFormat.ShortDatePattern 

To przyniesie format czasu dane z komputera patrząc na dane.

+6

Witamy w StackOverflow! Proszę ponownie przeczytać to pytanie. Użytkownik chce znać czas lokalny klienta, a nie format czasu. –

Powiązane problemy