Lorsque j'utilise DateTime.Now
J'obtiens la date et l'heure du point de vue du serveur. Existe-t-il un moyen d'obtenir la date et l'heure client dans ASP.NET?
Ce que je ferais, c'est créer un champ de saisie masqué, puis câbler une routine Javascript à l'événement onsubmit pour le formulaire. Cette routine remplirait le champ caché avec l'heure sur la machine cliente.
Le champ masqué peut être utilisé avec ASP.NET en utilisant la classe "HtmlInputHidden" du contrôle HTML. Vous donnez simplement à votre contrôle d'entrée un attribut runat = "server" comme tout autre contrôle côté serveur.
Le serveur peut alors lire cette fois lorsque le formulaire est renvoyé. Vous pouvez même envelopper cela dans un contrôle serveur si vous devez le faire à plusieurs endroits.
Alternativement, vous pouvez le faire avec AJAX mais l'implémentation dépendra de la bibliothèque que vous utilisez.
J'aime l'idée d'utiliser l'heure et le fuseau horaire du navigateur/système ou de les laisser sélectionner leur fuseau horaire. Dans un projet précédent, j'ai utilisé quelque chose comme ceci:
<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>
Et puis sur le serveur:
/// <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;
}
Ou vous pouvez le passer en tant que paramètre d'URL et le gérer dans le
http://Host/page.aspx?tz=-360
N'oubliez pas d'utiliser des minutes, car tous les fuseaux horaires ne sont pas des heures entières.
si vous gérez un profil utilisateur, vous pouvez lui demander de vous indiquer son fuseau horaire, puis de faire les calculs nécessaires.
L'alternative est de géolocaliser l'utilisateur en fonction de son adresse IP. Ou géolocalisez si le navigateur a cette capacité (bientôt pour Firefox). Une fois que vous avez l'emplacement de l'utilisateur, vous pouvez rechercher le fuseau horaire.
La solution javascript est probablement bonne et facile.
Le client et le serveur peuvent ne pas être totalement synchronisés, la question est donc de savoir si vous voulez l'heure sur l'ordinateur client, ou si vous voulez l'heure sur le serveur, mais ajustée pour les différences de fuseau horaire. Javascript peut vous donner l'heure sur le client (y compris le fuseau horaire). Vous pouvez également combiner l'heure sur le serveur avec le fuseau horaire du client.
Cependant, vous ne pouvez jamais obtenir l'heure avec une précision supérieure à la latence d'une demande.