Преобразования строк типа datetime в PHP-страниц с учетом часового пояса пользователя


Я работаю на приложения PHP/MySQL, который использует другой часовой пояс на сервере он работает, а не на часовые пояса, по Гринвичу. Я преобразования отображается время быть в часовой пояс пользователя, и мне интересно, будет ли мой подход разумный. Я бы с удовольствием любую обратную связь вы могли бы иметь.

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

<meta name="date" content="<?php echo date('Y-m-d H:i:s') ?>" />

И, каждый экземпляр datetime в строку заворачивают таким образом:

<span class="datetime-convert"><?php echo $data->datetime_column ?></span>

Затем, после загрузки страницы, следующий вызов jQuery получает время, время пользователей, выясняет разницу между ними, и добавляет, что разница в данных datetime:

$("span.datetime-convert").each(function(){
    var serverTime = parseDatetime($("meta[name='date']").attr("content"));
    var userTime = new Date();
    var userOffset = new Date(userTime.getTime() - serverTime.getTime());
    var timeToConvert = parseDatetime($(this).text());
    var convertedTime = new Date(timeToConvert.getTime() + userOffset.getTime());
    $(this).text(convertedTime.toLocaleString());
});
function parseDatetime(value) {
    var a = /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/.exec(value);
    if (a) {
        return new Date(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]);
    }
    return null;
}

Что я делаю не так?



Комментарии
1 ответ

Я думаю, что было бы проще и надежнее использовать смещения часового пояса, а не точное время сервера и клиента время. Вы можете получить клиент-сторона смещения, используя новую дату().getTimezoneOffset() , которая возвращает смещение от UTC в минутах. Когда часовой пояс +2, то смещение -120.

В PHP

<meta name="timezoneoffset" content="<?php echo date('P') ?>" />

HTML-код

<meta name="timezoneoffset" content="+0200" />

В JavaScript

var serverTimeZone= $("meta[name='timezoneoffset']").attr("content").substring(0,3);
// getTimezoneOffset returns (client timezone * -60).
// With timezones the the formula would be (clientTz - serverTz) * 60 * 60000
var timezoneOffset = (new Date().getTimezoneOffset() + (serverTimeZone * 60)) * 60000;
$("span.datetime-convert").each(function(){
var date = parseDatetime($(this).text());
if(date) { // If date is not wellformed the script would crash without this guard
var offsetDate = new Date(date.getTime() + timezoneOffset);
$(this).text(offsetDate .toLocaleString());
}
});
function parseDatetime(value) {
var a = /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/.exec(value);
if (a) {
return new Date(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]);
}
return null;
}

Также нет необходимости вычислять смещение для каждой отдельной даты. Он может быть на самом деле немного вводит в заблуждение, когда смещение немного разные для каждой даты.

http://jsfiddle.net/xXVPC/1/

Более функциональный:

var serverTimeZone= $("meta[name='timezoneoffset']").attr("content").substring(0,3);
// getTimezoneOffset returns (client timezone * -60).
// With timezones the the formula would be (clientTz - serverTz) * 60 * 60000
var timezoneOffset = (new Date().getTimezoneOffset() + (serverTimeZone * 60)) * 60000;
$("span.datetime-convert").each(function(){
var e = $(this);
parseDatetime(e.text(), new function(date) {
var offsetDate = new Date(date.getTime() + timezoneOffset);
e.text(offsetDate.toLocaleString());
});
});
function parseDatetime(value, callback) {
var a = /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/.exec(value);
if (a) {
callback(new Date(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));
}
}

3
ответ дан 19 июля 2011 в 06:07 Источник Поделиться