2008-11-08 88 views
23

Cuando uso DateTime.Now obtengo la fecha y la hora desde el punto de vista del servidor. ¿Hay alguna forma de obtener cliente fecha y hora en ASP.NET?¿Cómo obtener la fecha y hora del cliente en ASP.NET?

+0

JavaScript podría ser malo, porque muchos usuarios tienen su tiempo configurado incorrectamente. Además, podría ser abusado por alguien. Debe validar si el desplazamiento a UTC es razonable o no está seguro. – hangy

Respuesta

11

Lo que haría es crear un campo de entrada oculto y luego conectar una rutina de Javascript al evento de envío de la forma. Esta rutina llenaría el campo oculto con la hora en la máquina del cliente.

El campo oculto se puede utilizar con ASP.NET utilizando la clase de control HTML "HtmlInputHidden". Simplemente le da control de entrada un atributo runat = "server" como cualquier otro control del lado del servidor.

El servidor puede leer esta vez cuando el formulario se publique. Incluso podría incluir esto en un control de servidor si necesita hacer esto en varios lugares.

Como alternativa, puede hacer esto con AJAX pero la implementación dependerá de la biblioteca que use.

+2

En lugar de hacer todo eso, simplemente use Javascript para establecer una cookie, almacenando la zona horaria del navegador. Entonces el backend puede leer esa cookie siempre que sea. –

+0

El problema con una cookie es que la gente viaja. –

4

si está manteniendo un perfil de usuario, puede pedirles que le digan su zona horaria y luego hacer los cálculos necesarios.

0

La alternativa es geolocalizar al usuario en función de su dirección IP. O geolocalizar si el navegador tiene esta capacidad (próximamente para Firefox). Una vez que tenga la ubicación del usuario, puede buscar la zona horaria.

La solución javascript es probablemente una buena y fácil.

+2

IP no necesariamente dará la respuesta correcta. Tengo un cliente que usa un único sitio para toda la conectividad de red (canalizaciones directas de un sitio a otro), por lo que todos ellos provienen de un IP CST, independientemente de dónde se encuentren. –

+0

Stephen: Hacemos el negocio para ocultar las direcciones IP de los clientes, por lo que VPN-in está en Praga y la delegación está en Berlín. Y los clientes están, por ejemplo, en Moscú. – abatishchev

0

El cliente y el servidor pueden no estar totalmente sincronizados, por lo que la pregunta es si desea la hora en la computadora cliente o si desea la hora en el servidor, pero ajustada para las diferencias de zona horaria. Javascript puede darle tiempo al cliente (incluida la zona horaria). También puede combinar la hora en el servidor con la zona horaria del cliente.

Sin embargo, nunca podrá obtener el tiempo con mayor precisión que la latitud de una solicitud.

16

Me gusta la idea de usar el navegador/la zona horaria y la hora del sistema o dejarles seleccionar su zona horaria. En un proyecto pasado solía algo como esto:

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

Y luego en el servidor:

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

O puede pasarlo como un parámetro URL y manejarlo en el Page_Load:

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

Recuerde utilizar los minutos, ya que no todas las zonas horarias son horas completas.

+0

esta línea no está clara Int32.TryParse (cookie.Value, resultado de salida); usted almacena el valor de la cookie en la variable de resultado, pero antes de almacenar el minuto total en la variable de resultado. no muy clara la función GetTimeZoneOffset() de rutina del lado del servidor. si es posible, por favor explique. – Thomas

+0

@Thomas Empecé con la zona horaria del servidor y luego verifico si existe la cookie de zona horaria del cliente. Si la cookie existe, intente convertir la cadena en los minutos enteros. – Ryan

-5

He utilizado este método en ASP.Net con VB

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

Esto producirá el formato de hora de datos del ordenador busca en los datos.

+6

¡Bienvenido a StackOverflow! Por favor vuelve a leer la pregunta. El usuario desea saber la hora local del cliente, no el formato de hora. –

Cuestiones relacionadas