У меня есть некоторые трудности, показывающие фактическое время сервера с использованием php и js.
на стороне сервера у меня следующий код php:
$date = new DateTime();
echo $date->getTimestamp();
на стороне клиента, если есть следующий код js, который изменяет содержимое div для отображения текущего времени:
flag = true;
timer = '';
function clock()
{
if ( flag ) {
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "backend/time_backend.php?action=serverTime", false);
xmlhttp.send();
var stamp = xmlhttp.responseText;
timer = stamp*1000;
}
var d = new Date(timer);
var hours = d.getHours();
var minutes = d.getMinutes();
var seconds = d.getSeconds();
//hours = hours % 12;
//hours = hours ? hours : 12; // the hour 0' should be 12'
minutes = minutes < 10 ? '0'+minutes : minutes;
seconds = seconds < 10 ? '0'+seconds : seconds;
var strTime = hours + ':' + minutes + ':' + seconds;
document.getElementById("clock").innerHTML= strTime ;
flag = false;
timer = timer + 1000;
}
window.onload = function() {
setInterval(clock, 1000);
};
это работает до тех пор, пока часовой пояс сервера и моего сервера одинаковый. но как только я изменяю часовой пояс на сервере, он больше не работает. он все равно покажет время моего локального клиента, хотя date
команды bash на сервере показывает время в правом смещении.
Как это исправить? мне действительно нужно показать сервер-местное время.
Вы отправляете в timestamp unix из PHP, вероятно, должны использовать
echo date("Y-m-d H:i:s", time());
если вы хотите использовать строку для создания объекта даты с помощью JS.
Ваш JS-код должен быть
function clock()
{
if ( flag ) {
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "backend/time_backend.php?action=serverTime", false);
xmlhttp.send();
var stamp = xmlhttp.responseText;
var timer = new Date(stamp);
}
var d = new Date(timer);
var hours = d.getHours();
var minutes = d.getMinutes();
var seconds = d.getSeconds();
//hours = hours % 12;
//hours = hours ? hours : 12; // the hour 0' should be 12'
minutes = minutes < 10 ? '0'+minutes : minutes;
seconds = seconds < 10 ? '0'+seconds : seconds;
var strTime = hours + ':' + minutes + ':' + seconds;
document.getElementById("clock").innerHTML= strTime ;
flag = false;
timer = new Date(timer.getTime() + 1000);
}
Вы можете использовать дату в формате ISO 8601.
$date = date("c", time());
Дай вам один.
ISO 8601 Элементы данных и форматы обмена - Обмен информацией. Представление дат и времени является международным стандартом, охватывающим обмен данными по дате и времени. Он был выпущен Международной организацией по стандартизации (ИСО) и был впервые опубликован в 1988 году. Целью настоящего стандарта является предоставление однозначного и четко определенного метода представления дат и времени во избежание неправильной интерпретации числовых представлений дат и раз, особенно когда данные передаются между странами с различными соглашениями для написания числовых дат и времени.
Затем вы можете сделать Date.parse(), в котором будет возвращена метка времени;), затем продолжайте, как если бы вы получили временную метку.
console.log(stamp)
напечатано 2015-03-26T20:44:16+02:00
(часовой пояс 19:44:16
), и браузер показал мне 19:44:16
(мое местное время, часовой пояс Берлина).
new Date(stamp)
напрямую также приводит к конвертации в ваш местный часовой пояс. Что вы отслеживаете смещение по сравнению с вашим часовым поясом. Затем вам нужно будет добавить или вычесть это из отметки времени :( Если я получу его, а вы пытаетесь отобразить время, которое находится на сервере, а не на клиенте. Верно? :)
Date::getTimestamp
всегда возвращает Date::getTimestamp
времени Unix. Временная метка Unix не хранит информацию о часовом поясе.
Решение состоит в том, чтобы создать объект JavaScript Date из даты, заданной сервером.
Примечание. Время не будет синхронизироваться, когда сервер или клиент изменят часовые пояса (т.е. DST). Если избежать запросов на бэкэнд, более точное решение будет заключаться в использовании библиотеки часовых поясов в JavaScript (например, timezone.js).
PHP:
$date = new DateTime;
echo json_encode(array(
'year' => (int) $date->format('Y'),
'month' => (int) $date->format('m'),
'day' => (int) $date->format('j'),
'hours' => (int) $date->format('H'),
'minutes' => (int) $date->format('i'),
'seconds' => (int) $date->format('s'),
));
JavaScript:
var date = null;
function updateTime() {
if (!date) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "backend/time_backend.php?action=serverTime", false);
xmlhttp.send();
var j = JSON.parse(xmlhttp.responseText);
date = new Date(
j['year'], j['month'],
j['day'], j['hours'],
j['minutes'], j['seconds']
);
return;
}
// Increment time by 1 second
date.setTime(date.getTime() + 1000);
}
function clock() {
updateTime();
var hours = date.getHours();
var minutes = date.getMinutes();
var seconds = date.getSeconds();
hours = hours % 12;
hours = hours ? hours : 12; // the hour 0' should be 12'
minutes = minutes < 10 ? '0'+minutes : minutes;
seconds = seconds < 10 ? '0'+seconds : seconds;
var strTime = hours + ':' + minutes + ':' + seconds;
document.getElementById('clock').innerHTML = strTime;
}
window.onload = function() {
setInterval(clock, 1000);
};
time_backend.php
с кодом, предоставляющим метку времени вtime_backend.php
.