2008-11-08 4 views
23

Wenn ich DateTime.Now verwende, bekomme ich das Datum und die Uhrzeit vom Server Sicht. Gibt es eine Möglichkeit, den Client Datum und Uhrzeit in ASP.NET zu erhalten?Wie erhalten Sie Client-Datum und -Zeit in ASP.NET?

+0

JavaScript könnte schlecht sein, weil viele Benutzer ihre Zeit ungenau eingestellt haben. Es könnte auch von jemandem missbraucht werden. Sie müssen überprüfen, ob der Offset zu UTC sinnvoll ist oder nicht. – hangy

Antwort

11

Was ich tun würde, ist ein verstecktes Eingabefeld zu erstellen und dann eine Javascript-Routine an das onsubmit-Ereignis für das Formular zu verkabeln. Diese Routine würde das verborgene Feld mit der Zeit auf dem Clientcomputer füllen.

Das ausgeblendete Feld kann mit ASP.NET mithilfe der HTML-Steuerelement "HtmlInputHidden" -Klasse verwendet werden. Sie geben nur ein Eingabesteuerelement wie jedes andere serverseitige Steuerelement ein runat = "server" -Attribut.

Der Server kann dann diese Zeit auslesen, wenn das Formular zurückbucht. Sie können dies sogar in ein Server-Steuerelement einfügen, wenn Sie dies an mehreren Stellen tun müssen.

Alternativ können Sie dies mit AJAX tun, aber die Implementierung hängt davon ab, welche Bibliothek Sie verwenden.

+2

Anstatt all dies zu tun, verwenden Sie einfach Javascript, um einen Cookie zu setzen und die Zeitzone des Browsers zu speichern. Dann kann das Backend diesen Cookie jederzeit lesen. –

+0

Das Problem mit einem Cookie ist, dass Menschen reisen. –

4

Wenn Sie ein Benutzerprofil verwalten, können Sie sie bitten, Ihnen ihre Zeitzone mitzuteilen, und dann die erforderlichen Berechnungen durchführen.

0

Die Alternative besteht darin, den Benutzer basierend auf seiner IP-Adresse zu geolocatieren. Oder geolocate, wenn der Browser diese Funktion hat (in Kürze für Firefox). Sobald Sie den Standort des Benutzers haben, können Sie die Zeitzone suchen.

Die Javascript-Lösung ist wahrscheinlich eine gute und einfache.

+2

IP wird nicht unbedingt die richtige Antwort geben. Ich habe einen Client, der einen einzigen Standort für die gesamte Netzwerkkonnektivität verwendet (direkte Pipes von einem Standort zum anderen), so dass alle von einer CST-IP kommen, unabhängig davon, wo sie sich gerade befinden. –

+0

Stephen: Wir machen das Geschäft, um Client-IPs zu verstecken, also ist VPN-in in Prag und Proxy-out ist in Berlin. Und Kunden sind zum Beispiel in Moskau. – abatishchev

0

Client und Server möglicherweise nicht vollständig synchronisiert, so ist die Frage, ob Sie die Zeit auf dem Client-Computer möchten, oder Sie möchten die Zeit auf dem Server, aber für Zeitzonen Unterschiede angepasst. Javascript kann Ihnen die Zeit auf dem Client (einschließlich der Zeitzone) bringen. Sie können die Uhrzeit auf dem Server auch mit der Zeitzone des Clients kombinieren.

Sie können nie die Zeit mit höherer Genauigkeit bekommen als die Kürze einer Anfrage.

16

Ich mag die Idee, entweder die Browser/Systemzeit und Zeitzone zu verwenden oder sie ihre Zeitzone auswählen zu lassen. In einem früheren Projekt habe ich so etwas wie dieses:

<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> 

Und dann auf dem Server:

/// <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; 
} 

Oder man kann es als URL-Parameter übergeben in und handhaben es in der Page_Load:

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

Denken Sie daran, Minuten zu verwenden, da nicht alle Zeitzonen ganze Stunden sind.

+0

Diese Zeile ist nicht klar Int32.TryParse (cookie.Value, out-Ergebnis); Sie speichern den Cookie-Wert in der Ergebnisvariablen, aber bevor Sie die gesamte Minute in der Ergebnisvariablen speichern. nicht sehr klar Ihre serverseitige Routine GetTimeZoneOffset() -Funktion. wenn möglich, erklären plzz. – Thomas

+0

@Thomas Ich begann mit der Server-Zeitzone und dann überprüfen, ob der Client Zeitzone Cookie existiert. Wenn der Cookie vorhanden ist, versuchen Sie, die Zeichenfolge in die Ganzzahl Minuten zu konvertieren. – Ryan

-5

benutzte ich diese Methode in ASP.Net mit VB

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

Dies wird die Daten-Zeitformat des Computers an den Daten suchen ergeben.

+6

Willkommen bei StackOverflow! Bitte lesen Sie die Frage noch einmal. Der Benutzer möchte die Ortszeit des Clients kennen, nicht das Zeitformat. –