Подтвердить что ты не робот

Как получить точное местное время клиента?

Каков наилучший способ получить локальное время клиентов независимо от часового пояса системы клиентов? Я создаю приложение, и мне нужно в первую очередь получить точное время и дату того места, откуда клиент обращается. Даже обнаружение IP-адреса клиентской системы имеет недостаток или обнаружение часового пояса клиентской системы может иногда быть рискованным. Итак, есть ли какой-либо выход, который может быть действительно надежным и не уязвимым для ошибки, поскольку отображение неправильного времени и даты для клиента является чем-то очень смущенным.

4b9b3361

Ответ 1

В JavaScript? Просто создайте новый объект Дата

var now = new Date();

Это создаст новый объект Date с локальным временем клиента.

Ответ 2

Если вы хотите узнать часовой пояс клиента относительно GMT/UTC здесь, вы:

var d = new Date();
var tz = d.toString().split("GMT")[1].split(" (")[0]; // timezone, i.e. -0700

Если вы хотите указать фактическое имя часового пояса, вы можете попробовать следующее:

var d = new Date();
var tz = d.toString().split("GMT")[1]; // timezone, i.e. -0700 (Pacific Daylight Time)

ОБНОВЛЕНИЕ 1

В первом комментарии вы также можете использовать d.getTimezoneOffset() для получения смещения в минутах от UTC. Пару исцелений с ним, хотя.

  • Знак (+/-) возвращенных минут, вероятно, является противоположностью ожидаемого. Если вы на 8 часов меньше, чем UTC, он вернется 480 not -480. Для дополнительной документации смотрите MDN или MSDN.
  • Фактически он не возвращает какой часовой пояс, по которому клиент сообщает, что он похож на второй пример, который я дал. Только минуты, отсчитываемые от UTC в настоящее время. Таким образом, он будет меняться в зависимости от летнего времени.

ОБНОВЛЕНИЕ 2

В то время как примеры разбиения строк работают, они могут ввести в заблуждение чтение. Вот регулярная версия, которая должна быть понятнее и, вероятно, быстрее (оба метода очень быстрые).

Если вы хотите узнать часовой пояс клиента относительно GMT/UTC здесь, вы:

var gmtRe = /GMT([\-\+]?\d{4})/; // Look for GMT, + or - (optionally), and 4 characters of digits (\d)
var d = new Date().toString();
var tz = gmtRe.exec(d)[1]; // timezone, i.e. -0700

Если вы хотите, чтобы фактическое имя часового пояса попробовало это:

var tzRe = /\(([\w\s]+)\)/; // Look for "(", any words (\w) or spaces (\s), and ")"
var d = new Date().toString();
var tz = tzRe.exec(d)[1]; // timezone, i.e. "Pacific Daylight Time"

Ответ 3

В настоящее время вы можете получить правильный часовой пояс пользователя, имеющего только одну строку кода:

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

источник: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/resolvedOptions

Затем вы можете использовать момент-время для анализа часового пояса, например:

const currentTime = moment().tz(timezone).format();

Ответ 4

Просто нужно было решить эту мысль, я оставил бы свой ответ. jQuery не требуется Я использовал для обновления элемента, поскольку у меня уже был кешированный объект.

Сначала я написал функцию php, чтобы вернуть требуемые даты/время в мой HTML-шаблон

 /**
 * Gets the current location time based on timezone
 * @return string
 */


function get_the_local_time($timezone) {

    //$timezone ='Europe/London';

    $date = new DateTime('now', new DateTimeZone($timezone));

    return array(
        'local-machine-time' => $date->format('Y-m-d\TH:i:s+0000'),
        'local-time' => $date->format('h:i a')
    );

}

Затем он используется в моем шаблоне HTML для отображения начального времени и отображает формат даты, необходимый javascript в атрибуте данных.

        <span class="box--location__time" data-time="<?php echo $time['local-machine-time']; ?>">
            <?php  echo $time['local-time']; ?>
        </span>

Затем я использовал getUTCHours на моем объекте даты, чтобы вернуть время независимо от часового пояса пользователей

Метод getUTCHours() возвращает час (от 0 до 23) указанную дату и время, в соответствии с универсальным временем.

var initClocks = function() {

    var $clocks = $('.box--location__time');

    function formatTime(hours, minutes) {

        if (hours === 0) {
            hours = 12;
        }

        if (hours < 10) {
            hours = "0" + hours;
        }

        if (minutes < 10) {
            minutes = "0" + minutes;
        }

        return {
            hours: hours,
            minutes: minutes
        }
    }

    function displayTime(time, $clockDiv) {

        var currentTime = new Date(time);

        var hours = currentTime.getUTCHours();
        var minutes = currentTime.getUTCMinutes();
        var seconds = currentTime.getUTCSeconds();
        var initSeconds = seconds;

        var displayTime = formatTime(hours, minutes);

        $clockDiv.html(displayTime.hours + ":" + displayTime.minutes + ":" + seconds);

        setInterval(function() {

            if (initSeconds > 60) {
                initSeconds = 1;
            } else {
                initSeconds++;
            }

            currentTime.setSeconds(initSeconds);

            hours = currentTime.getUTCHours();
            minutes = currentTime.getUTCMinutes();
            seconds = currentTime.getUTCSeconds();

            displayTime = formatTime(hours, minutes);

            $clockDiv.html(displayTime.hours + ":" + displayTime.minutes + ":" + seconds);

        }, 1000);

    }



    $clocks.each(function() {

        displayTime($(this).data('time'), $(this));

    });

};

Затем я использую метод setSeconds для обновления объекта даты в зависимости от количества секунд, прошедших с момента загрузки страницы (простая функция интервала), и обновления HTML

Ответ 5

Самый надежный способ, с помощью которого я обнаружил местное время в городе или местоположении, - это использовать API-интерфейс Часовой пояс, например Часовой пояс Google API. Он возвращает правильный часовой пояс, и, что более важно, сокращение дневного сбережения времени любого местоположения, которое просто использует объект JavaScript Date(), не может быть сделано, насколько мне известно. Там хороший учебник по использованию API для получения и отображения локального времени здесь:

var loc = '35.731252, 139.730291' // Tokyo expressed as lat,lng tuple
var targetDate = new Date() // Current date/time of user computer
var timestamp = targetDate.getTime()/1000 + targetDate.getTimezoneOffset() * 60 // Current UTC date/time expressed as seconds since midnight, January 1, 1970 UTC
var apikey = 'YOUR_TIMEZONE_API_KEY_HERE'
var apicall = 'https://maps.googleapis.com/maps/api/timezone/json?location=' + loc + '&timestamp=' + timestamp + '&key=' + apikey

var xhr = new XMLHttpRequest() // create new XMLHttpRequest2 object
xhr.open('GET', apicall) // open GET request
xhr.onload = function(){
    if (xhr.status === 200){ // if Ajax request successful
        var output = JSON.parse(xhr.responseText) // convert returned JSON string to JSON object
        console.log(output.status) // log API return status for debugging purposes
        if (output.status == 'OK'){ // if API reports everything was returned successfully
            var offsets = output.dstOffset * 1000 + output.rawOffset * 1000 // get DST and time zone offsets in milliseconds
            var localdate = new Date(timestamp * 1000 + offsets) // Date object containing current time of Tokyo (timestamp + dstOffset + rawOffset)
            console.log(localdate.toLocaleString()) // Display current Tokyo date and time
        }
    }
    else{
        alert('Request failed.  Returned status of ' + xhr.status)
    }
}
xhr.send() // send request

От: Отображение локального времени любого города с использованием JavaScript и API часовых поясов Google

Ответ 6

мой код

  <html>
  <head>
  <title>Title</title>
  <script type="text/javascript"> 
  function display_c(){
  var refresh=1000; // Refresh rate in milli seconds
  mytime=setTimeout('display_ct()',refresh)
  }

  function display_ct() {
  var strcount
  var x = new Date()
  document.getElementById('ct').innerHTML = x;
  tt=display_c();
  }
  </script>
  </head>

  <body onload=display_ct();>
  <span id='ct' ></span>

  </body>
  </html>

если вы хотите, чтобы другие коды посещали мой блог http://mysimplejavascriptcode.blogspot.in/

Ответ 7

Попробуйте этот способ

    function timenow(){
    var now= new Date(), 
    ampm= 'am', 
    h= now.getHours(), 
    m= now.getMinutes(), 
    s= now.getSeconds();
    if(h>= 12){
        if(h>12) h -= 12;
        ampm= 'pm';
    }

    if(m<10) m= '0'+m;
    if(s<10) s= '0'+s;
    return now.toLocaleDateString()+ ' ' + h + ':' + m + ':' + s + ' ' + ampm;
}

toLocaleDateString()

- это функция для изменения формата даты, например toLocaleDateString("en-us")