Determine a user's timezone

前端 未结 25 2935
刺人心
刺人心 2020-11-21 07:12

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

相关标签:
25条回答
  • 2020-11-21 07:33

    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.

    0 讨论(0)
  • 2020-11-21 07:34

    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!

    0 讨论(0)
  • 2020-11-21 07:36

    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.

    0 讨论(0)
  • 2020-11-21 07:38

    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.

    0 讨论(0)
  • 2020-11-21 07:38

    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
    ?>
    
    0 讨论(0)
  • 2020-11-21 07:38

    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();.

    0 讨论(0)
提交回复
热议问题