Determinar la zona horaria de un usuario -- html campo con browser campo con timezone campo con user-agent campo con timezone-offset camp Relacionados El problema

Determine a user's timezone


635
vote

problema

Español

¿Hay una forma estándar para que un servidor web pueda determinar la zona horaria de un usuario dentro de una página web?

Tal vez de un encabezado HTTP o parte del Form7 STRING?

Original en ingles

Is there a standard way for a web server to be able to determine a user's timezone within a web page?

Perhaps from an HTTP header or part of the user-agent string?

</div
              
         
         

Lista de respuestas

329
 
vote
  -new Date().getTimezoneOffset()/60;   

El método getTimezoneOffset() restará su tiempo de GMT y devolverá el número de minutos. Entonces, si vives en GMT-8, devolverá 480.

Para poner esto en horas, dividir por 60. Además, notifique que el letrero es lo contrario de lo que necesita: está calculando el desplazamiento de GMT de su zona horaria, no es la compensación de su zona horaria de GMT. Para solucionar esto, simplemente multiplica por -1.

También tenga en cuenta que w3school dice:

El valor devuelto no es una constante, debido a la práctica de usar Tiempo de verano de la luz del día.

 
-new Date().getTimezoneOffset()/60; 

The method getTimezoneOffset() will subtract your time from GMT and return the number of minutes. So if you live in GMT-8, it will return 480.

To put this into hours, divide by 60. Also, notice that the sign is the opposite of what you need - it's calculating GMT's offset from your time zone, not your time zone's offset from GMT. To fix this, simply multiply by -1.

Also note that w3school says:

The returned value is not a constant, because of the practice of using Daylight Saving Time.

</div
 
 
         
         
198
 
vote

La forma más popular (== estándar?) De determinar la zona horaria que he visto es simplemente Preguntando a los propios usuarios. Si su sitio web requiere suscripción, esto podría guardarse en los usuarios. 'Datos de perfil. Para los usuarios de Anon, las fechas podrían mostrarse como UTC o GMT o algunas similares.

No estoy tratando de ser un inteligente aleck. Es solo que a veces algunos problemas tienen soluciones más finas fuera de cualquier contexto de programación.

 

The most popular (==standard?) way of determining the time zone I've seen around is simply asking the users themselves. If your website requires subscription, this could be saved in the users' profile data. For anon users, the dates could be displayed as UTC or GMT or some such.

I'm not trying to be a smart aleck. It's just that sometimes some problems have finer solutions outside of any programming context.

</div
 
 
         
         
152
 
vote

No hay encabezados HTTP que informarán a los clientes TimeZone hasta ahora, aunque se le ha sugerido incluirlo en la especificación HTTP.

Si era yo, probablemente intentaría buscar a TimeZone usando Clientide Javascript y luego enviarlo al servidor con AJAX o algo.

 

There are no HTTP headers that will report the clients timezone so far although it has been suggested to include it in the HTTP specification.

If it was me, I would probably try to fetch the timezone using clientside JavaScript and then submit it to the server using Ajax or something.

</div
 
 
         
         
68
 
vote

Primero, entienda que la detección de la zona horaria en JavaScript es imperfecta. Puede obtener el desplazamiento de la zona horaria local para una fecha y hora en particular usando getTimezoneOffset en una instancia del objeto Date , pero eso no es del todo el igual que un completo zona horaria icada como America/Los_Angeles .

Hay algunas opciones que pueden funcionar, aunque:

  • La mayoría de los navegadores modernos apoyan las zonas horarias de IANA en su implementación de la API de internacionalización de ECMASCRIP , para que puedas hacer esto:

  const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone; console.log(tzid);  

El resultado es una cadena que contiene la configuración de la zona horaria IANA de la computadora donde se está ejecutando el código.

Los entornos compatibles se enumeran en la tabla de compatibilidad de INTL < / a>. Amplíe la sección DateTimeFormat , y mire la función llamada resolvedOptions().timeZone defaults to the host environment .

  • Algunas bibliotecas, como Luxon Use esta API para determinar la zona horaria a través de funciones como luxon.Settings.defaultZoneName .

  • Si necesita admitir un conjunto más amplio de entornos, como los navegadores web más antiguos, puede usar una biblioteca para hacer una creación educada en la zona horaria. Trabajan primero intentando el Intl API Si está disponible, y cuando no está disponible, interrogan la función luxon.Settings.defaultZoneName8 del objeto , para Varios puntos diferentes en el tiempo, utilizando los resultados para elegir una zona horaria apropiada desde un conjunto de datos internos.

    Tanto JstimezoneEtetect y momento-timeZone tiene esta funcionalidad.

      Date0  

    En ambos casos, el resultado solo puede considerarse como una conjetura. La conjetura puede ser correcta en muchos casos, pero no todos.

    Además, estas bibliotecas deben actualizarse periódicamente para contrarrestar el hecho de que muchas implementaciones de JavaScript más antiguas son solo conscientes de la regla de tiempo de verano actual para su zona horaria local. Más detalles sobre eso aquí. < / p>

En última instancia, un enfoque mejor es pedirle a su usuario su zona horaria. Proporcionar una configuración que puedan cambiar. Puede usar una de las opciones anteriores para elegir una configuración predeterminada , pero no hagas imposible desviarse de eso en su aplicación.

También está el enfoque completamente diferente de no que confía en la configuración de la zona horaria de la computadora del usuario en absoluto. En su lugar, si puede recopilar coordenadas de latitud y longitud, puede resolverlas a una zona horaria usando uno de estos métodos . Esto funciona bien en dispositivos móviles.

 

First, understand that time zone detection in JavaScript is imperfect. You can get the local time zone offset for a particular date and time using getTimezoneOffset on an instance of the Date object, but that's not quite the same as a full IANA time zone like America/Los_Angeles.

There are some options that can work though:

  • Most modern browsers support IANA time zones in their implementation of the ECMAScript Internationalization API, so you can do this:

const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone; console.log(tzid);

The result is a string containing the IANA time zone setting of the computer where the code is running.

Supported environments are listed in the Intl compatibility table. Expand the DateTimeFormat section, and look at the feature named resolvedOptions().timeZone defaults to the host environment.

  • Some libraries, such as Luxon use this API to determine the time zone through functions like luxon.Settings.defaultZoneName.

  • If you need to support an wider set of environments, such as older web browsers, you can use a library to make an educated guess at the time zone. They work by first trying the Intl API if it's available, and when it's not available, they interrogate the getTimezoneOffset function of the Date object, for several different points in time, using the results to choose an appropriate time zone from an internal data set.

    Both jsTimezoneDetect and moment-timezone have this functionality.

      // using jsTimeZoneDetect   var tzid = jstz.determine().name();    // using moment-timezone   var tzid = moment.tz.guess(); 

    In both cases, the result can only be thought of as a guess. The guess may be correct in many cases, but not all of them.

    Additionally, these libraries have to be periodically updated to counteract the fact that many older JavaScript implementations are only aware of the current daylight saving time rule for their local time zone. More details on that here.

Ultimately, a better approach is to actually ask your user for their time zone. Provide a setting that they can change. You can use one of the above options to choose a default setting, but don't make it impossible to deviate from that in your app.

There's also the entirely different approach of not relying on the time zone setting of the user's computer at all. Instead, if you can gather latitude and longitude coordinates, you can resolve those to a time zone using one of these methods. This works well on mobile devices.

</div
 
 
     
     
54
 
vote

JavaScript es la forma más fácil de obtener la hora local del cliente. Sugeriría usar un XMLHTTPRequest para enviar la hora local, y si eso falla, retrocede a La zona horaria detectó en función de su dirección IP.

En cuanto a la geolocalización, he usado maxmind geoip en varios proyectos y Funciona bien, aunque no estoy seguro de si proporcionan datos TimeZone. Es un servicio que paga y proporcionan actualizaciones mensuales a su base de datos. Proporcionan envoltorios en varios idiomas web.

 

JavaScript is the easiest way to get the client's local time. I would suggest using an XMLHttpRequest to send back the local time, and if that fails, fall back to the timezone detected based on their IP address.

As far as geolocation, I've used MaxMind GeoIP on several projects and it works well, though I'm not sure if they provide timezone data. It's a service you pay for and they provide monthly updates to your database. They provide wrappers in several web languages.

</div
 
 
   
   
52
 
vote

Aquí hay una solución robusta de JavaScript para determinar la zona horaria que se encuentra el navegador.

  Date111  

https://github.com/pellepim/jstimezonedetect

 

Here is a robust JavaScript solution to determine the time zone the browser is in.

>>> var timezone = jstz.determine(); >>> timezone.name();  "Europe/London" 

https://github.com/pellepim/jstimezonedetect

</div
 
 
       
       
43
 
vote

aquí es una forma más completa.

  1. Obtenga el desplazamiento de la zona horaria para el usuario
  2. Pruebe algunos días en los límites de verano para determinar si están en una zona que usa el ahorro de luz.

Un extracto está abajo:

  function TimezoneDetect(){     var dtDate = new Date('1/1/' + (new Date()).getUTCFullYear());     var intOffset = 10000; //set initial offset high so it is adjusted on the first attempt     var intMonth;     var intHoursUtc;     var intHours;     var intDaysMultiplyBy;      // Go through each month to find the lowest offset to account for DST     for (intMonth=0;intMonth < 12;intMonth++){         //go to the next month         dtDate.setUTCMonth(dtDate.getUTCMonth() + 1);          // To ignore daylight saving time look for the lowest offset.         // Since, during DST, the clock moves forward, it'll be a bigger number.         if (intOffset > (dtDate.getTimezoneOffset() * (-1))){             intOffset = (dtDate.getTimezoneOffset() * (-1));         }     }      return intOffset; }   

Obteniendo TZ y DST de JS (Via Way Machine)

 

Here is a more complete way.

  1. Get the timezone offset for the user
  2. Test some days on daylight saving boundaries to determine if they are in a zone that uses daylight saving.

An excerpt is below:

function TimezoneDetect(){     var dtDate = new Date('1/1/' + (new Date()).getUTCFullYear());     var intOffset = 10000; //set initial offset high so it is adjusted on the first attempt     var intMonth;     var intHoursUtc;     var intHours;     var intDaysMultiplyBy;      // Go through each month to find the lowest offset to account for DST     for (intMonth=0;intMonth < 12;intMonth++){         //go to the next month         dtDate.setUTCMonth(dtDate.getUTCMonth() + 1);          // To ignore daylight saving time look for the lowest offset.         // Since, during DST, the clock moves forward, it'll be a bigger number.         if (intOffset > (dtDate.getTimezoneOffset() * (-1))){             intOffset = (dtDate.getTimezoneOffset() * (-1));         }     }      return intOffset; } 

Getting TZ and DST from JS (via Way Back Machine)

</div
 
 
   
   
33
 
vote

Uso del enfoque de Unkwntech, escribí una función usando JQery y PHP. Esto se prueba y funciona!

En la página PHP donde desea tener la zona horaria como una variable, tenga este fragmento de código en algún lugar cerca de la parte superior de la página:

  <?php     session_start();     $timezone = $_SESSION['time']; ?>   

Esto leerá la variable de sesión "Tiempo", que ahora estamos a punto de crear.

en la misma página, en el & lt; cabeza y gt;, necesitas en primer lugar incluir jquery:

  <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>   

también en el & lt; cabeza y gt;, debajo del jquery, pegue esto:

  <script type="text/javascript">     $(document).ready(function() {         if("<?php echo $timezone; ?>".length==0){             var visitortime = new Date();             var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60;             $.ajax({                 type: "GET",                 url: "http://example.org/timezone.php",                 data: 'time='+ visitortimezone,                 success: function(){                     location.reload();                 }             });         }     }); </script>   

Puede que pueda o no haber notado, pero debe cambiar la URL a su dominio real.

Una última cosa. Probablemente se está preguntando qué es el Heck TimeZone.php. Bueno, es simplemente esto: (Cree un nuevo archivo llamado timeZone.php y apunte a ella con la URL anterior)

  <?php     session_start();     $_SESSION['time'] = $_GET['time']; ?>   

Si esto funciona correctamente, cargará primero la página, ejecute el JavaScript y recargará la página. ¡Entonces podrás leer la variable $ TimeZone y usarlo para su placer! Devuelve el desplazamiento actual de la zona horaria UTC / GMT (GMT -7) o en lo que se encuentre en TimeZone.

 

Using Unkwntech's approach, I wrote a function using jQuery and PHP. This is tested and does work!

On the PHP page where you want to have the timezone as a variable, have this snippet of code somewhere near the top of the page:

<?php     session_start();     $timezone = $_SESSION['time']; ?> 

This will read the session variable "time", which we are now about to create.

On the same page, in the <head>, you need to first of all include jQuery:

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script> 

Also in the <head>, below the jQuery, paste this:

<script type="text/javascript">     $(document).ready(function() {         if("<?php echo $timezone; ?>".length==0){             var visitortime = new Date();             var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60;             $.ajax({                 type: "GET",                 url: "http://example.org/timezone.php",                 data: 'time='+ visitortimezone,                 success: function(){                     location.reload();                 }             });         }     }); </script> 

You may or may not have noticed, but you need to change the URL to your actual domain.

One last thing. You are probably wondering what the heck timezone.php is. Well, it is simply this: (create a new file called timezone.php and point to it with the above URL)

<?php     session_start();     $_SESSION['time'] = $_GET['time']; ?> 

If this works correctly, it will first load the page, execute the JavaScript, and reload the page. You will then be able to read the $timezone variable and use it to your pleasure! It returns the current UTC/GMT time zone offset (GMT -7) or whatever timezone you are in.

</div
 
 
   
   
26
 
vote

Para enviar el desplazamiento TimeZone como un encabezado HTTP en las solicitudes de AJAX con jquery

  $.ajaxSetup({     beforeSend: function(xhr, settings) {         xhr.setRequestHeader("X-TZ-Offset", -new Date().getTimezoneOffset()/60);     } });   

También puede hacer algo similar para obtener el nombre de la zona horaria real usando moment.tz.guess(); de http://momentjs.com/timezone/docs/#/using-timezones/guesing-user-timezone/

 

To submit the timezone offset as an HTTP header on AJAX requests with jQuery

$.ajaxSetup({     beforeSend: function(xhr, settings) {         xhr.setRequestHeader("X-TZ-Offset", -new Date().getTimezoneOffset()/60);     } }); 

You can also do something similar to get the actual time zone name by using moment.tz.guess(); from http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/

</div
 
 
   
   
25
 
vote

Todavía no he visto una respuesta detallada aquí que obtiene la zona horaria. No debe necesitar geocoditar por dirección IP o usar PHP (LOL) o adivinar incorrectamente desde un desplazamiento.

En primer lugar, una zona horaria no es solo un desplazamiento de GMT. Es un área de tierra en la que las normas de tiempo están establecidas por los estándares locales. Algunos países tienen ahorro de luz del día, y cambiarán DST en momentos diferentes. Por lo general, es importante obtener la zona real, no solo el desplazamiento actual.

Si tiene la intención de almacenar esta zona horaria, por ejemplo, en las preferencias del usuario, desea la zona y no solo el desplazamiento. Para conversiones en tiempo real, no importará mucho.

Ahora, para obtener la zona horaria con JavaScript puede usar esto:

  >> new Date().toTimeString(); "15:46:04 GMT+1200 (New Zealand Standard Time)" //Use some regular expression to extract the time.   

Sin embargo, me pareció más fácil usar simplemente este complemento robusto que devuelve la zona horaria formateada OLSEN:

https://github.com/scottwater/jquery.detect_timezone

 

I still have not seen a detailed answer here that gets the time zone. You shouldn't need to geocode by IP address or use PHP (lol) or incorrectly guess from an offset.

Firstly a time zone is not just an offset from GMT. It is an area of land in which the time rules are set by local standards. Some countries have daylight savings, and will switch on DST at differing times. It's usually important to get the actual zone, not just the current offset.

If you intend to store this timezone, for instance in user preferences you want the zone and not just the offset. For realtime conversions it won't matter much.

Now, to get the time zone with javascript you can use this:

>> new Date().toTimeString(); "15:46:04 GMT+1200 (New Zealand Standard Time)" //Use some regular expression to extract the time. 

However I found it easier to simply use this robust plugin which returns the Olsen formatted timezone:

https://github.com/scottwater/jquery.detect_timezone

</div
 
 
23
 
vote

Con la función PHP date obtendrá la fecha de fecha del servidor en la que se encuentra el sitio. La única forma de obtener el tiempo de usuario es usar JavaScript.

Pero le sugiero que, si su sitio tiene un registro requerido, entonces la mejor manera es solicitar al usuario mientras se registre como un campo obligatorio. Puede enumerar varias zonas horarias en la página de registro y guardarlas en la base de datos. Después de esto, si el usuario inicia sesión en el sitio, puede configurar la zona horaria predeterminada para esa sesión según la zona horaria seleccionada de los usuarios.

Puede establecer cualquier zona horaria específica utilizando la función PHP date_default_timezone_set . Esto establece la zona horaria especificada para los usuarios.

Básicamente, la zona horaria de los usuarios va al lado del cliente, por lo que debemos usar JavaScript para esto.

A continuación se muestra el script para obtener la zona horaria de los usuarios utilizando PHP y JavaScript.

  <?php     session_start();     $timezone = $_SESSION['time']; ?> 0  

Pero según mi punto de vista, es mejor solicitar a los usuarios si el registro es obligatorio en su proyecto.

 

With the PHP date function you will get the date time of server on which the site is located. The only way to get the user time is to use JavaScript.

But I suggest you to, if your site has registration required then the best way is to ask the user while to have registration as a compulsory field. You can list various time zones in the register page and save that in the database. After this, if the user logs in to the site then you can set the default time zone for that session as per the users’ selected time zone.

You can set any specific time zone using the PHP function date_default_timezone_set. This sets the specified time zone for users.

Basically the users’ time zone is goes to the client side, so we must use JavaScript for this.

Below is the script to get users’ time zone using PHP and JavaScript.

<?php     #http://www.php.net/manual/en/timezones.php List of Time Zones     function showclienttime()     {         if(!isset($_COOKIE['GMT_bias']))         { ?>              <script type="text/javascript">                 var Cookies = {};                 Cookies.create = function (name, value, days) {                     if (days) {                         var date = new Date();                         date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));                         var expires = "; expires=" + date.toGMTString();                     }                     else {                         var expires = "";                     }                     document.cookie = name + "=" + value + expires + "; path=/";                     this[name] = value;                 }                  var now = new Date();                 Cookies.create("GMT_bias",now.getTimezoneOffset(),1);                 window.location = "<?php echo $_SERVER['PHP_SELF'];?>";             </script>              <?php          }         else {           $fct_clientbias = $_COOKIE['GMT_bias'];         }          $fct_servertimedata = gettimeofday();         $fct_servertime = $fct_servertimedata['sec'];         $fct_serverbias = $fct_servertimedata['minuteswest'];         $fct_totalbias = $fct_serverbias – $fct_clientbias;         $fct_totalbias = $fct_totalbias * 60;         $fct_clienttimestamp = $fct_servertime + $fct_totalbias;         $fct_time = time();         $fct_year = strftime("%Y", $fct_clienttimestamp);         $fct_month = strftime("%B", $fct_clienttimestamp);         $fct_day = strftime("%d", $fct_clienttimestamp);         $fct_hour = strftime("%I", $fct_clienttimestamp);         $fct_minute = strftime("%M", $fct_clienttimestamp);         $fct_second = strftime("%S", $fct_clienttimestamp);         $fct_am_pm = strftime("%p", $fct_clienttimestamp);         echo $fct_day.", ".$fct_month." ".$fct_year." ( ".$fct_hour.":".$fct_minute.":".$fct_second." ".$fct_am_pm." )";     }      showclienttime(); ?> 

But as per my point of view, it’s better to ask to the users if registration is mandatory in your project.

</div
 
 
23
 
vote

No use la dirección IP para determinar definitivamente la ubicación (y, por lo tanto, TimeZone), eso es porque con NAT, los proxies (cada vez más populares) y VPN, las direcciones IP no reflejan necesariamente la ubicación real del usuario, sino la ubicación en el que residen los servidores que implementan esos protocolos.

Similar a la forma en que los códigos de área de EE. UU. Ya no son útiles para ubicar un usuario telefónico, dada la popularidad de la portabilidad numérica.

Dirección IP y otras técnicas que se muestran arriba son útiles para sugiriendo un valor predeterminado que el usuario puede ajustar / corregir.

 

Don't use the IP address to definitively determine location (and hence timezone)-- that's because with NAT, proxies (increasingly popular), and VPNs, IP addresses do not necessarily realistically reflect the user's actual location, but the location at which the servers implementing those protocols reside.

Similar to how US area codes are no longer useful for locating a telephone user, given the popularity of number portability.

IP address and other techniques shown above are useful for suggesting a default that the user can adjust/correct.

</div
 
 
22
 
vote

javascript:

  function maketimus(timestampz) {     var linktime = new Date(timestampz * 1000);     var linkday = linktime.getDate();     var freakingmonths = new Array();      freakingmonths[0]  = "jan";     freakingmonths[1]  = "feb";     freakingmonths[2]  = "mar";     freakingmonths[3]  = "apr";     freakingmonths[4]  = "may";     freakingmonths[5]  = "jun";     freakingmonths[6]  = "jul";     freakingmonths[7]  = "aug";     freakingmonths[8]  = "sep";     freakingmonths[9]  = "oct";     freakingmonths[10] = "nov";     freakingmonths[11] = "dec";      var linkmonthnum = linktime.getMonth();     var linkmonth = freakingmonths[linkmonthnum];     var linkyear = linktime.getFullYear();     var linkhour = linktime.getHours();     var linkminute = linktime.getMinutes();      if (linkminute < 10)     {         linkminute = "0" + linkminute;     }      var fomratedtime = linkday + linkmonth + linkyear + " " +                        linkhour + ":" + linkminute + "h";     return fomratedtime; }   

Simplemente proporcione su tiempo en un formato de marca de tiempo de UNIX en esta función; Javascript ya conoce la zona horaria del usuario.

Me gusta esto:

PHP:

  echo '<script type="text/javascript"> var eltimio = maketimus('.$unix_timestamp_ofshiz.'); document.write(eltimio); </script><noscript>pls enable javascript</noscript>';   

Esto siempre mostrará los horarios correctamente basados ​​en la zona horaria que la persona ha establecido en su reloj de computadora. ¡No hay necesidad de pedirle nada a nadie y guardarlo en lugares, gracias a Dios!

 

JavaScript:

function maketimus(timestampz) {     var linktime = new Date(timestampz * 1000);     var linkday = linktime.getDate();     var freakingmonths = new Array();      freakingmonths[0]  = "jan";     freakingmonths[1]  = "feb";     freakingmonths[2]  = "mar";     freakingmonths[3]  = "apr";     freakingmonths[4]  = "may";     freakingmonths[5]  = "jun";     freakingmonths[6]  = "jul";     freakingmonths[7]  = "aug";     freakingmonths[8]  = "sep";     freakingmonths[9]  = "oct";     freakingmonths[10] = "nov";     freakingmonths[11] = "dec";      var linkmonthnum = linktime.getMonth();     var linkmonth = freakingmonths[linkmonthnum];     var linkyear = linktime.getFullYear();     var linkhour = linktime.getHours();     var linkminute = linktime.getMinutes();      if (linkminute < 10)     {         linkminute = "0" + linkminute;     }      var fomratedtime = linkday + linkmonth + linkyear + " " +                        linkhour + ":" + linkminute + "h";     return fomratedtime; } 

Simply provide your times in Unix timestamp format to this function; JavaScript already knows the timezone of the user.

Like this:

PHP:

echo '<script type="text/javascript"> var eltimio = maketimus('.$unix_timestamp_ofshiz.'); document.write(eltimio); </script><noscript>pls enable javascript</noscript>'; 

This will always show the times correctly based on the timezone the person has set on his/her computer clock. There is no need to ask anything to anyone and save it into places, thank god!

</div
 
 
 
 
21
 
vote

Fácil, solo use el JavaScript getTimezoneOffset Función así:

  -new Date().getTimezoneOffset()/60;   
 

Easy, just use the JavaScript getTimezoneOffset function like so:

-new Date().getTimezoneOffset()/60; 
</div
 
 
     
     
20
 
vote

Toda la magia parece estar en

  visitortime.getTimezoneOffset()   

Eso es genial, no lo sabía. ¿Funciona en Internet Explorer, etc.? Desde allí, debería poder usar JavaScript a Ajax, configure las cookies. Probablemente yo vaya a la ruta de las galletas yo mismo.

Tendrá que permitir que el usuario lo cambie. Intentamos usar la ubicación geográfica (a través de maxmind ) para hacer esto hace un tiempo, y fue lo suficientemente incorrecto para que no valga la pena hacerlo. Por lo tanto, simplemente dejamos que el usuario lo configure en su perfil y muestre un aviso a los usuarios que aún no se han establecido.

 

All the magic seems to be in

visitortime.getTimezoneOffset() 

That's cool, I didn't know about that. Does it work in Internet Explorer etc? From there you should be able to use JavaScript to Ajax, set cookies whatever. I'd probably go the cookie route myself.

You'll need to allow the user to change it though. We tried to use geo-location (via maxmind) to do this a while ago, and it was wrong enough to make it not worth doing. So we just let the user set it in their profile, and show a notice to users who haven't set theirs yet.

</div
 
 
16
 
vote

Aquí hay un artículo (con código fuente) que explica cómo determinar y usar la hora localizada en una aplicación ASP.NET (VB.NET, C #):

es sobre el tiempo

En resumen, el enfoque descrito se basa en la función JavaScript getTimezoneOffset6 , que devuelve el valor que se guarda en la cookie de sesión y se usa por código de atrás para ajustar los valores de tiempo entre GMT y hora local. Lo bueno es que el usuario no necesita especificar la zona horaria (el código lo hace automáticamente). Hay más involucrado (es por eso que vinculo al artículo), pero el código proporcionado hace que sea realmente fácil de usar. Sospecho que puede convertir la lógica a PHP y otros idiomas (siempre y cuando entienda ASP.NET).

 

Here is an article (with source code) that explains how to determine and use localized time in an ASP.NET (VB.NET, C#) application:

It's About Time

In short, the described approach relies on the JavaScript getTimezoneOffset function, which returns the value that is saved in the session cookie and used by code-behind to adjust time values between GMT and local time. The nice thing is that the user does not need to specify the time zone (the code does it automatically). There is more involved (this is why I link to the article), but provided code makes it really easy to use. I suspect that you can convert the logic to PHP and other languages (as long as you understand ASP.NET).

</div
 
 
       
       
15
 
vote

Si está usando openid para la autenticación, Extensión de registro simple resolvería el problema para los usuarios autenticados (deberá convertir de TZ a numérico).

Otra opción sería inferir la zona horaria de la preferencia del país del agente del usuario. Este es un método algo crudo (no funcionará para EN-US), pero hace una buena aproximación.

 

If you happen to be using OpenID for authentication, Simple Registration Extension would solve the problem for authenticated users (You'll need to convert from tz to numeric).

Another option would be to infer the time zone from the user agent's country preference. This is a somewhat crude method (won't work for en-US), but makes a good approximation.

</div
 
 
14
 
vote

Es simple con JavaScript y PHP:

Aunque el usuario puede meterse con su reloj interno y / o TimeZone, la mejor manera que encontré hasta ahora, para obtener el desplazamiento, sigue siendo new Date().getTimezoneOffset(); . No es invasivo, no da dolores de cabeza y elimina la necesidad de confiar en terceros.

Di que tengo una tabla, users , que contiene un campo date_created int(13) , para almacenar las marcas de tiempo de UNIX;

Suponiendo un cliente creates a new account , los datos se reciben mediante post , y necesito insert/update El date_created column6 con La marca de tiempo UNIX del cliente, no el servidor.

Dado que el TimeZoneOffset se necesita en el momento de la inserción / actualización, se pasa como un elemento adicional de $ _post cuando el cliente envía el formulario, eliminando así la necesidad de almacenarlo en sesiones y / o cookies, y sin servidor adicional hits tampoco.

  var off = (-new Date().getTimezoneOffset()/60).toString();//note the '-' in front which makes it return positive for negative offsets and negative for positive offsets var tzo = off == '0' ? 'GMT' : off.indexOf('-') > -1 ? 'GMT'+off : 'GMT+'+off;   

Diga que el servidor recibe tzo como $_POST['tzo'] ;

  users0  

Insertar / Actualizar users111111 .

Al recuperar el Date_Created, puede convertir la marca de tiempo así:

  users2  

Ahora, este ejemplo puede adaptarse a las necesidades de uno, cuando se trata de insertar una marca de tiempo users3 cuando se trata de una marca de tiempo adicional, o en la tabla, es posible que desee considerar insertar el valor de TZO en la tabla de usuarios para futuras referencias, o configurarla como sesión o como cookie.

P.s. Pero, ¿qué pasa si el usuario viaja y cambia los timones horarios? Registre en GMT + 4, viaja rápido a GMT-1 y vuelva a iniciar sesión. El último inicio de sesión estaría en el futuro.

Creo que ... Pensamos demasiado.

 

It is simple with JavaScript and PHP:

Even though the user can mess with his/her internal clock and/or timezone, the best way I found so far, to get the offset, remains new Date().getTimezoneOffset();. It's non-invasive, doesn't give head-aches and eliminates the need to rely on third parties.

Say I have a table, users, that contains a field date_created int(13), for storing Unix timestamps;

Assuming a client creates a new account, data is received by post, and I need to insert/update the date_created column with the client's Unix timestamp, not the server's.

Since the timezoneOffset is needed at the time of insert/update, it is passed as an extra $_POST element when the client submits the form, thus eliminating the need to store it in sessions and/or cookies, and no additional server hits either.

var off = (-new Date().getTimezoneOffset()/60).toString();//note the '-' in front which makes it return positive for negative offsets and negative for positive offsets var tzo = off == '0' ? 'GMT' : off.indexOf('-') > -1 ? 'GMT'+off : 'GMT+'+off; 

Say the server receives tzo as $_POST['tzo'];

$ts = new DateTime('now', new DateTimeZone($_POST['tzo']); $user_time = $ts->format("F j, Y, g:i a");//will return the users current time in readable format, regardless of whether date_default_timezone() is set or not. $user_timestamp = strtotime($user_time); 

Insert/update date_created=$user_timestamp.

When retrieving the date_created, you can convert the timestamp like so:

$date_created = // Get from the database $created = date("F j, Y, g:i a",$date_created); // Return it to the user or whatever 

Now, this example may fit one's needs, when it comes to inserting a first timestamp... When it comes to an additional timestamp, or table, you may want to consider inserting the tzo value into the users table for future reference, or setting it as session or as a cookie.

P.S. BUT what if the user travels and switches timezones. Logs in at GMT+4, travels fast to GMT-1 and logs in again. Last login would be in the future.

I think... we think too much.

</div
 
 
14
 
vote

Podría hacerlo en el cliente con momento-timzone y envíe el valor al servidor; Uso de la muestra:

  users4  
 

You could do it on the client with moment-timezone and send the value to server; sample usage:

> moment.tz.guess() "America/Asuncion" 
</div
 
 
   
   
12
 
vote

Obteniendo una base de datos TZ de la base de datos de TZ válida en PHP es un proceso de dos pasos:

  1. Con JavaScript, obtenga el desplazamiento de la zona horaria en minutos a través de users5 . Este compensado será positivo si la zona horaria local está detrás de UTC y negativa si está por delante. Así que debe agregar un signo opuesto al desplazamiento.

      users6  

    Pase esta compensación a PHP.

  2. en PHP Convierta este desplazamiento en un nombre TimBone válido con timeZone_name_from_abbr Función.

      users7  

He escrito una publicación de blog en él: Cómo detectar la zona horaria de usuario en PHP . También contiene una demostración.

 

Getting a valid TZ Database timezone name in PHP is a two-step process:

  1. With JavaScript, get timezone offset in minutes through getTimezoneOffset. This offset will be positive if the local timezone is behind UTC and negative if it is ahead. So you must add an opposite sign to the offset.

    var timezone_offset_minutes = new Date().getTimezoneOffset(); timezone_offset_minutes = timezone_offset_minutes == 0 ? 0 : -timezone_offset_minutes; 

    Pass this offset to PHP.

  2. In PHP convert this offset into a valid timezone name with timezone_name_from_abbr function.

    // Just an example. $timezone_offset_minutes = -360;  // $_GET['timezone_offset_minutes']  // Convert minutes to seconds $timezone_name = timezone_name_from_abbr("", $timezone_offset_minutes*60, false);  // America/Chicago echo $timezone_name;</code></pre> 

I've written a blog post on it: How to Detect User Timezone in PHP. It also contains a demo.

</div
 
 
 
 
10
 
vote

Una forma sencilla de hacerlo es usando:

  users8  
 

A simple way to do it is by using:

new Date().getTimezoneOffset(); 
</div
 
 
   
   
9
 
vote

Una opción posible es usar el campo de encabezado date_created column19 , que se define en RFC 7231 y se supone que incluye la zona horaria. Por supuesto, no está garantizado que el valor es realmente la zona horaria del cliente, pero puede ser un punto de partida conveniente.

 

One possible option is to use the Date header field, which is defined in RFC 7231 and is supposed to include the timezone. Of course, it is not guaranteed that the value is really the client's timezone, but it can be a convenient starting point.

</div
 
 
 
 
9
 
vote

Así es como lo hago. Esto establecerá la zona horaria predeterminada PHP a la zona horaria local del usuario. Simplemente pegue lo siguiente en la parte superior de todas sus páginas:

  date_created int(13)0  
 

Here's how I do it. This will set the PHP default timezone to the user's local timezone. Just paste the following on the top of all your pages:

<?php session_start();  if(!isset($_SESSION['timezone'])) {     if(!isset($_REQUEST['offset']))     {     ?>         <script>         var d = new Date()         var offset= -d.getTimezoneOffset()/60;         location.href = "<?php echo $_SERVER['PHP_SELF']; ?>?offset="+offset;         </script>         <?php        }     else     {         $zonelist = array('Kwajalein' => -12.00, 'Pacific/Midway' => -11.00, 'Pacific/Honolulu' => -10.00, 'America/Anchorage' => -9.00, 'America/Los_Angeles' => -8.00, 'America/Denver' => -7.00, 'America/Tegucigalpa' => -6.00, 'America/New_York' => -5.00, 'America/Caracas' => -4.30, 'America/Halifax' => -4.00, 'America/St_Johns' => -3.30, 'America/Argentina/Buenos_Aires' => -3.00, 'America/Sao_Paulo' => -3.00, 'Atlantic/South_Georgia' => -2.00, 'Atlantic/Azores' => -1.00, 'Europe/Dublin' => 0, 'Europe/Belgrade' => 1.00, 'Europe/Minsk' => 2.00, 'Asia/Kuwait' => 3.00, 'Asia/Tehran' => 3.30, 'Asia/Muscat' => 4.00, 'Asia/Yekaterinburg' => 5.00, 'Asia/Kolkata' => 5.30, 'Asia/Katmandu' => 5.45, 'Asia/Dhaka' => 6.00, 'Asia/Rangoon' => 6.30, 'Asia/Krasnoyarsk' => 7.00, 'Asia/Brunei' => 8.00, 'Asia/Seoul' => 9.00, 'Australia/Darwin' => 9.30, 'Australia/Canberra' => 10.00, 'Asia/Magadan' => 11.00, 'Pacific/Fiji' => 12.00, 'Pacific/Tongatapu' => 13.00);         $index = array_keys($zonelist, $_REQUEST['offset']);         $_SESSION['timezone'] = $index[0];     } }  date_default_timezone_set($_SESSION['timezone']);  //rest of your code goes here ?> 
</div
 
 
 
 
9
 
vote

Pruebe este código PHP:

  date_created int(13)1  
 

Try this PHP code:

<?php     $ip = $_SERVER['REMOTE_ADDR'];     $json = file_get_contents("http://api.easyjquery.com/ips/?ip=" . $ip . "&full=true");     $json = json_decode($json,true);     $timezone = $json['LocalTimeZone']; ?> 
</div
 
 
0
 
vote

No hay tal manera de calcular la zona horaria en el código HTML real o cualquier cadena date_created column6222 , pero lo que puede hacer es hacer una función básica para obtenerlo utilizando JavaScript.

No sé cómo codificar con JavaScript todavía, por lo que mi función podría tomar tiempo para hacer.

Sin embargo, puede intentar obtener la función real de tiempo real que utiliza JavaScript con la sección date_created column23 en la sección o simplemente date_created int(13)5 . < / p>

 

There's no such way to figure the timezone in the actual HTML code or any user-agent string, but what you can do is make a basic function getting it using JavaScript.

I don't know how to code with JavaScript yet so my function might take time to make.

However, you can try to get the actual timezone also using JavaScript with the getTzimezoneOffset() function in the Date section or simply new Date().getTimezoneOffset();.

</div
 
 

Relacionados problema

0  ¿Cómo analizar la marca de tiempo y la zona horaria, simultáneamente con Moshi?  ( How to parse time stamp and time zone offset simultaneously with moshi ) 
Una respuesta JSON-API contiene las siguientes propiedades: display_errors2 Estoy usando moshi y thitenbp Para analizar los sellos de tiempo y prepa...

2  MongoDB ahorra un dia de problema de zona menor  ( Mongodb saves one day less time zone issue ) 
I Fecha de publicación en el formato de angular como MM / DD / YYAY, pero cuando se guarda en Mongodb, ahorra el formato ISO () con un día menos. Estoy desarr...

635  Determinar la zona horaria de un usuario  ( Determine a users timezone ) 
¿Hay una forma estándar para que un servidor web pueda determinar la zona horaria de un usuario dentro de una página web? Tal vez de un encabezado HTTP o pa...

5  En PostgreSQL, cómo invertir las compensaciones de TimeZone con "en la zona horaria"  ( In postgresql how to un invert the timezone offsets with at time zone ) 
Estoy tratando de envolver mi cabeza alrededor de PostgreSQL Timebonzones, y parece que no puedo entender esto. EST es "Tiempo estándar del este" en América, ...

2  ¿El soporte de QML se convierte en DIFERENTEZONETE SOBRE TIMEZONE BASADO EN TIMEZONEID?  ( Does qml support converting to different timezone based on timezoneid ) 
Estoy haciendo un programa QML de un reloj mundial. Actualmente estoy usando una API para obtener el ID de TimeZone de una cierta ciudad. Así, por ejemplo, ...

0  Zonas de tiempo inusuales en Ipligence Pro  ( Unusual time zones in ipligence pro ) 
Hemos estado usando Database Pro para obtener la zona horaria de usuario basada en la dirección IP . Aquí tengo unas pocas zonas horarias de unusal. Que se ...

1  ¿Oracle DB capaz de devolver la región de la zona horaria en lugar de solo el desplazamiento?  ( Is oracle db able to return timezone region rather than just the offset ) 
es Oracle DB capaz de devolver la región de TimeZone E.G. ¿Europa / Londres en lugar de solo la compensación? Me gustaría saber el nombre de la región donde r...

0  Ajuste de la zona horaria en JavaScript basado en la ubicación de IP  ( Timezone adjustment in javascript based on ip location ) 
offset = new Date().getTimezoneOffset(); Esto le da a TimZone Offset, basado en el reloj de computadora o la zona horaria del navegador. ¿Hay alguna maner...

3  DateTime en ElasticSearch - Cómo manejar TimeZone  ( Datetime in elasticsearch how to handle timezone ) 
Intento indexar un campo que contiene una fecha. ¿Cómo puedo indexar una fecha de una zona horaria diferente? Me he establecido el campo de Elasticsearch ...

0  MySQL: preguntándose cómo seleccionar registros basados ​​en el día, después de ajustar para TimeZone  ( Mysql wondering how to select records based on day after adjusting for timezon ) 
Quiero seleccionar registros que están "actualmente disponibles" en función de los detalles en las tablas. Creo que debería ser fácil, pero, por supuesto, no ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos