Domanda

Esiste un modo standard affinché un server Web sia in grado di determinare il fuso orario di un utente all'interno di una pagina Web?

Forse da un'intestazione HTTP o da parte del file user-agent corda?

Nessuna soluzione corretta

Altri suggerimenti

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

Il metodo getTimezoneOffset() sottrarrà il tuo tempo dal GMT e restituirà il numero di minuti.Quindi, se vivi nel GMT-8, restituirà 480.

Per metterlo in ore, dividi per 60.Inoltre, nota che il segno è l'opposto di ciò di cui hai bisogno: sta calcolando l'offset del GMT dal tuo fuso orario, non l'offset del tuo fuso orario dal GMT.Per risolvere questo problema, moltiplica semplicemente per -1.

Nota anche questo w3school dice:

Il valore restituito non è una costante, a causa della pratica dell'utilizzo dell'ora legale.

Il modo più popolare (==standard?) per determinare il fuso orario che ho visto in giro è semplicemente chiedendo agli utenti stessi. Se il tuo sito web richiede un abbonamento, questo potrebbe essere salvato nei dati del profilo degli utenti.Per gli utenti non esperti, le date potrebbero essere visualizzate come UTC o GMT o qualcosa di simile.

Non sto cercando di fare il furbo.È solo che a volte alcuni problemi hanno soluzioni più precise al di fuori di qualsiasi contesto di programmazione.

Finora non sono presenti intestazioni HTTP che riportino il fuso orario dei client, sebbene sia stato suggerito di includerlo nella specifica HTTP.

Se fossi in me, probabilmente proverei a recuperare il fuso orario utilizzando JavaScript sul lato client e quindi a inviarlo al server utilizzando Ajax o qualcosa del genere.

JavaScript è il modo più semplice per ottenere l'ora locale del client.Suggerirei di utilizzare un XMLHttpRequest per inviare indietro l'ora locale e, se fallisce, tornare al fuso orario rilevato in base al proprio indirizzo IP.

Per quanto riguarda la geolocalizzazione, ho usato MaxMindGeoIP su diversi progetti e funziona bene, anche se non sono sicuro che forniscano dati sul fuso orario.È un servizio per cui paghi e forniscono aggiornamenti mensili al tuo database.Forniscono wrapper in diversi linguaggi web.

Ecco una solida soluzione JavaScript per determinare il fuso orario in cui si trova il browser.

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

https://bitbucket.org/pellepim/jstimezonedetect

Ecco un modo più completo.

  1. Ottieni la differenza di fuso orario per l'utente
  2. Testare alcuni giorni nei limiti dell'ora legale per determinare se si trovano in una zona che utilizza l'ora legale.

Un estratto è di seguito:

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

Ottenere TZ e DST da JS (tramite Way Back Machine)

Innanzitutto, comprendi che il rilevamento del fuso orario in JavaScript è imperfetto.Puoi ottenere il locale differenza di fuso orario per una data e un'ora particolari utilizzando getTimezoneOffset su un'istanza di Date object, ma non è proprio la stessa cosa di un full Fuso orario IANA Piace America/Los_Angeles.

Ci sono alcune opzioni che possono funzionare però:

  • La maggior parte dei browser moderni supporta i fusi orari IANA nell'implementazione di API di internazionalizzazione ECMAScript, quindi puoi fare questo:

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

    Il risultato è una stringa contenente l'impostazione del fuso orario IANA del computer su cui è in esecuzione il codice.

    Sono elencati gli ambienti supportati nella tabella compatibilità internazionale.Espandi il DateTimeFormat sezione e osserva la funzionalità denominata resolvedOptions().timeZone defaults to the host environment.

    • Alcune biblioteche, come ad es Luxon utilizzare questa API per determinare il fuso orario attraverso funzioni come luxon.Settings.defaultZoneName.
  • Se è necessario supportare un insieme più ampio di ambienti, come i browser Web meno recenti, è possibile utilizzare una libreria per creare un file ipotesi plausibile al fuso orario.Funzionano provando prima il Intl API se è disponibile e, quando non è disponibile, interrogano il file getTimezoneOffset funzione del Date oggetto, per diversi punti temporali, utilizzando i risultati per scegliere un fuso orario appropriato da un set di dati interno.

    Entrambi jsTimezoneDetect E momento-fuso orario avere questa funzionalità.

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

    In entrambi i casi, il risultato può essere considerato solo come un’ipotesi.L’ipotesi può essere corretta in molti casi, ma non in tutti.

    Inoltre, queste librerie devono essere aggiornate periodicamente per contrastare il fatto che molte implementazioni JavaScript meno recenti sono a conoscenza solo del file attuale regola dell'ora legale per il fuso orario locale. Maggiori dettagli al riguardo qui.

In definitiva, un approccio migliore è chiedere effettivamente all'utente il suo fuso orario.Fornire un'impostazione che possano modificare.È possibile utilizzare una delle opzioni di cui sopra per scegliere a predefinito impostazione, ma non rendere impossibile deviarla nella tua app.

C'è anche l'approccio completamente diverso di non basandosi completamente sull'impostazione del fuso orario del computer dell'utente.Invece, se riesci a raccogliere le coordinate di latitudine e longitudine, puoi risolverle in un fuso orario utilizzando uno di questi metodi.Funziona bene sui dispositivi mobili.

Utilizzando l'approccio di Unkwntech, ho scritto una funzione utilizzando jQuery e PHP.Questo è testato e funziona!

Nella pagina PHP in cui desideri avere il fuso orario come variabile, inserisci questo snippet di codice da qualche parte vicino alla parte superiore della pagina:

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

Questo leggerà la variabile di sessione "time", che stiamo per creare ora.

Nella stessa pagina, nell'<head>, bisogna prima inserire jQuery:

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

Sempre in <head>, sotto jQuery, incolla questo:

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

Potresti averlo notato o meno, ma devi modificare l'URL del tuo dominio effettivo.

Un'ultima cosa.Probabilmente ti starai chiedendo cosa diavolo è timezone.php.Ebbene, è semplicemente questo:(crea un nuovo file chiamato fuso orario.php e indicarlo con l'URL sopra)

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

Se funziona correttamente, prima caricherà la pagina, eseguirà JavaScript e ricaricherà la pagina.Potrai quindi leggere la variabile $timezone e usarla a tuo piacimento!Restituisce l'offset del fuso orario UTC/GMT corrente (GMT -7) o qualunque sia il fuso orario in cui ti trovi.

Non ho ancora visto una risposta dettagliata qui che ottenga il fuso orario.Non dovrebbe essere necessario geocodificare in base all'indirizzo IP o utilizzare PHP (lol) o indovinare erroneamente da un offset.

Innanzitutto un fuso orario non è solo un offset rispetto al GMT.È un'area di terreno in cui le regole del tempo sono stabilite dagli standard locali.In alcuni paesi vige l'ora legale e l'ora legale verrà attivata in orari diversi.Di solito è importante ottenere la zona effettiva, non solo l'offset corrente.

Se intendi memorizzare questo fuso orario, ad esempio nelle preferenze dell'utente desideri il fuso orario e non solo l'offset.Per le conversioni in tempo reale non avrà molta importanza.

Ora, per ottenere il fuso orario con JavaScript puoi usare questo:

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

Tuttavia ho trovato più semplice utilizzare semplicemente questo robusto plugin che restituisce il fuso orario formattato Olsen:

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

Per inviare l'offset del fuso orario come intestazione HTTP sulle richieste AJAX con jQuery

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

Puoi anche fare qualcosa di simile per ottenere il nome effettivo del fuso orario utilizzando moment.tz.guess(); da http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/

Con il PHP date otterrai la data ora del server su cui si trova il sito.L'unico modo per ottenere il tempo dell'utente è utilizzare JavaScript.

Ma ti suggerisco di farlo, se il tuo sito richiede la registrazione, il modo migliore è chiedere all'utente di avere la registrazione come campo obbligatorio.Puoi elencare vari fusi orari nella pagina di registrazione e salvarli nel database.Successivamente, se l'utente accede al sito, è possibile impostare il fuso orario predefinito per quella sessione in base al fuso orario selezionato dagli utenti.

Puoi impostare qualsiasi fuso orario specifico utilizzando la funzione PHP date_default_timezone_set.Imposta il fuso orario specificato per gli utenti.

Fondamentalmente il fuso orario degli utenti va sul lato client, quindi dobbiamo utilizzare JavaScript per questo.

Di seguito è riportato lo script per ottenere il fuso orario degli utenti utilizzando PHP e 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();
?>

Ma secondo il mio punto di vista, è meglio chiedere agli utenti se la registrazione è obbligatoria nel tuo progetto.

Facile, basta usare JavaScript getTimezoneOffset funzionare in questo modo:

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

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

Fornisci semplicemente i tuoi orari nel formato timestamp Unix a questa funzione;JavaScript conosce già il fuso orario dell'utente.

Come questo:

PHP:

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

Ciò mostrerà sempre gli orari correttamente in base al fuso orario che la persona ha impostato sull'orologio del proprio computer.Non c'è bisogno di chiedere nulla a nessuno e salvarlo in posti, grazie a Dio!

La magia sembra essere tutta lì

visitortime.getTimezoneOffset()

Che bello, non lo sapevo.Funziona in Internet Explorer e così via?Da lì dovresti essere in grado di utilizzare JavaScript su Ajax, impostare cookie, qualunque cosa.Probabilmente anch'io seguirei la strada dei biscotti.

Dovrai però consentire all'utente di modificarlo.Abbiamo provato a utilizzare la geolocalizzazione (tramite maxmind) per fare questo qualche tempo fa, ed era sbagliato abbastanza spesso - abbastanza da non valere la pena farlo, quindi lasciamo semplicemente che l'utente lo imposti nel proprio profilo e mostri un avviso agli utenti che non hanno ancora impostato il loro.

Non utilizzare l'indirizzo IP per determinare in modo definitivo la posizione (e quindi il fuso orario): questo perché con NAT, proxy (sempre più popolari) e VPN, gli indirizzi IP non riflettono necessariamente in modo realistico la posizione effettiva dell'utente, ma la posizione in cui si trova l'utente. risiedono i server che implementano tali protocolli.

Similmente a come i prefissi statunitensi non sono più utili per localizzare un utente telefonico, data la popolarità della portabilità del numero.

L'indirizzo IP e le altre tecniche mostrate sopra sono utili per suggerendo un default che l'utente può regolare/correggere.

Se ti capita di usare OpenID per l'autenticazione, Estensione di registrazione semplice risolverebbe il problema per gli utenti autenticati (dovrai convertire da tz a numerico).

Un'altra opzione sarebbe quella di dedurre il fuso orario dalla preferenza del paese dell'agente utente.Questo è un metodo un po' rozzo (non funziona per gli Stati Uniti), ma costituisce una buona approssimazione.

Ecco un articolo (con codice sorgente) che spiega come determinare e utilizzare l'ora localizzata in un'applicazione ASP.NET (VB.NET, C#):

È quasi ora

In breve, l'approccio descritto si basa su JavaScript getTimezoneOffset funzione, che restituisce il valore salvato nel cookie di sessione e utilizzato dal code-behind per regolare i valori orari tra GMT e l'ora locale.La cosa bella è che l'utente non ha bisogno di specificare il fuso orario (il codice lo fa automaticamente).C'è molto di più (questo è il motivo per cui mi collego all'articolo), ma il codice fornito lo rende davvero facile da usare.Sospetto che tu possa convertire la logica in PHP e altri linguaggi (purché tu capisca ASP.NET).

È semplice con JavaScript e PHP:

Anche se l'utente può modificare il proprio orologio interno e/o fuso orario, il modo migliore che ho trovato finora, per ottenere l'offset, rimane new Date().getTimezoneOffset();.Non è invasivo, non dà grattacapi ed elimina la necessità di affidarsi a terzi.

Diciamo che ho un tavolo, users, che contiene un campo date_created int(13), per memorizzare i timestamp Unix;

Supponendo un cliente creates a new account, i dati vengono ricevuti da post, e ne ho bisogno insert/update IL date_created column con il timestamp Unix del client, non quello del server.

Poiché timezoneOffset è necessario al momento dell'inserimento/aggiornamento, viene passato come elemento $_POST aggiuntivo quando il client invia il modulo, eliminando così la necessità di memorizzarlo in sessioni e/o cookie, e senza ulteriori accessi al server.

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;

Supponiamo che il server riceva tzo COME $_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);

Inserisci/aggiorna date_created=$user_timestamp.

Quando recuperi date_created, puoi convertire il timestamp in questo modo:

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

Ora, questo esempio potrebbe soddisfare le proprie esigenze, quando si tratta di inserire a first timestamp...Quando si tratta di un timestamp o di una tabella aggiuntiva, potresti prendere in considerazione l'inserimento del valore tzo nella tabella degli utenti per riferimento futuro o l'impostazione come sessione o come cookie.

PSMA cosa succede se l'utente viaggia e cambia fuso orario.Effettua l'accesso al GMT+4, viaggia velocemente fino al GMT-1 e accede nuovamente.L'ultimo accesso sarà nel futuro.

Penso...pensiamo troppo.

Potresti farlo sul client con momento-fuso orario e inviare il valore al server;utilizzo del campione:

> moment.tz.guess()
"America/Asuncion"

Un modo semplice per farlo è utilizzare:

new Date().getTimezoneOffset();

Ottenere un nome di fuso orario valido per il database TZ in PHP è un processo in due passaggi:

  1. Con JavaScript, ottieni l'offset del fuso orario in pochi minuti getTimezoneOffset.Questo offset sarà positivo se il fuso orario locale è indietro rispetto all'UTC e negativo se è avanti.Quindi devi aggiungere un segno opposto all'offset.

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

    Passa questo offset a PHP.

  2. In PHP converti questo offset in un nome di fuso orario valido con nome_fuso_orario_da_abbr funzione.

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

Ho scritto un post sul blog a riguardo: Come rilevare il fuso orario dell'utente in PHP.Contiene anche una demo.

Una possibile opzione è utilizzare il file Date campo di intestazione, che è definito in RFC7231 e dovrebbe includere il fuso orario.Naturalmente non è garantito che il valore corrisponda effettivamente al fuso orario del cliente, ma può essere un comodo punto di partenza.

Ecco come lo faccio.Ciò imposterà il fuso orario predefinito di PHP sul fuso orario locale dell'utente.Basta incollare quanto segue nella parte superiore di tutte le tue pagine:

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

Prova questo codice PHP:

<?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'];
?>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top