Каков наилучший способ получить локальное время клиентов независимо от часового пояса системы клиентов? Я создаю приложение, и мне нужно в первую очередь получить точное время и дату того места, откуда клиент обращается. Даже обнаружение IP-адреса клиентской системы имеет недостаток или обнаружение часового пояса клиентской системы может иногда быть рискованным. Итак, есть ли какой-либо выход, который может быть действительно надежным и не уязвимым для ошибки, поскольку отображение неправильного времени и даты для клиента является чем-то очень смущенным.
Как получить точное местное время клиента?
Ответ 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;
Затем вы можете использовать момент-время для анализа часового пояса, например:
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 + '×tamp=' + 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")