2016-06-06 3 views
0

У меня есть приложение nodejs, которое размещено в IST Сервер часового пояса. Приложение имеет конфигурацию для приема timezone пользователя (Pacific Daylight Time). Поэтому на основе пользователя timezone Мне нужно отобразить данные для него. Но когда я получаю timezone для конкретного пользователя на сервере, чтобы получить некоторые статистические данные на сервере, даже если правильно выбрать timezone, он все равно возвращает Date(), относящийся к серверу, а не в соответствии с предпочтительным пользователем timezone. Ниже приведен фрагмент кода, я следующее:Смещение временной зоны на стороне сервера nodejs

var offset=-8; //(Pacific Daylight Time) 
var d = new Date(new Date().getTime() + offset * 3600 * 1000); 

выше var d будет по-прежнему иметь сервер часовой пояс схвачен и извлекает данные, основанные на сервере timezone. Как я могу получить date, относящийся к часовому поясу client, на сервере?

+0

Сроки, сами по себе, не имеют часовой пояс, их внутреннее значение времени UTC. Системный часовой пояс используется при создании «локальных» дат и при записи на вывод с использованием * Date.prototype.toString * и * toLocaleString *. Используйте UTC везде, и ваша проблема решена. – RobG

+0

@RobG с использованием UTC означает, что при хранении данных «date» необходимо сохранить UTC? –

+0

@RobG .. Я также читал, что хорошо использовать предпочтения от 'client' относительно' timezone' и хранить его. Тогда, вероятно, должен быть способ получить дату в отношении его предпочтения? –

ответ

1

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

Значение внутреннего времени даты - UTC, поэтому для любой даты вы можете отрегулировать значение времени по смещению, затем использовать методы UTC для вывода требуемых значений в желаемом формате и добавления часового пояса.

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

/* Given a Date, return an ISO 8601 formatted date and time string 
 
** for a particular time zone. 
 
** @param {number} offset - offset in minutes +east, -west 
 
** @param {Date} d - date to use, default is now 
 
** @returns {string} ISO 8601 formatted string for supplied time zone offset 
 
*/ 
 
function dateForTimezone(offset, d) { 
 

 
    // Copy date if supplied or use current 
 
    d = d? new Date(+d) : new Date(); 
 

 
    // Use supplied offset or system 
 
    offset = offset || -d.getTimezoneOffset(); 
 
    // Prepare offset values 
 
    var offSign = offset < 0? '-' : '+'; 
 
    offset = Math.abs(offset); 
 
    var offHours = ('0' + (offset/60 | 0)).slice(-2); 
 
    var offMins = ('0' + (offset % 60)).slice(-2); 
 

 
    // Apply offset to d 
 
    d.setUTCMinutes(d.getUTCMinutes() - offset); 
 

 
    // Return formatted string 
 
    return d.getUTCFullYear() + 
 
    '-' + ('0' + (d.getUTCMonth()+1)).slice(-2) + 
 
    '-' + ('0' + d.getUTCDate()).slice(-2) + 
 
    'T' + ('0' + d.getUTCHours()).slice(-2) + 
 
    ':' + ('0' + d.getUTCMinutes()).slice(-2) + 
 
    ':' + ('0' + d.getUTCSeconds()).slice(-2) + 
 
    '.' + ('000' + d.getUTCMilliseconds()).slice(-3) + 
 
    offSign + offHours + ':' + offMins; 
 
    
 
} 
 

 
document.write('Current date and time in US Pacific Daylight Time (PDT) time zone UTC-07:00 is: <br>' + 
 
       dateForTimezone(-420,new Date()));

+0

Спасибо @RobG .. Я попробую это решение и позволю вам как можно скорее .. :) –

+1

Обратите внимание, что вышеупомянутое не будет учитывать изменения летнего времени, поэтому лучше использовать UTC, поскольку у хоста, скорее всего, будут соответствующие настройки и будет отображаться стандартное или летнее время, подходящее для конкретной даты и времени. Простым способом для UTC является сохранение строки, созданной * toISOString *, или значение времени, возвращаемое * getTime *. Я предпочитаю второй, поскольку он полностью преобразуется в Дату правильно всеми системами. – RobG

1

В вашем серверном коде var d = new Date(new Date().getTime() + offset * 3600 * 1000); время всегда возвращает время сервера вместо часового пояса клиента, поскольку оно выполняется на сервере. Таким образом, вы можете отправить время клиента как строку в запросе http, а затем преобразовать временную строку в фактическое время. Затем вы получите время часового пояса клиента. Надеюсь, ваша проблема будет решена.

+0

+1 для идеи, но тогда должно быть некоторое использование сохранения предпочтительного часового пояса клиента? Это наиболее рекомендуемый способ тоже IMHO .. –

+1

@sabbir, OP отправляет 'часовой пояс' пользователя с' клиентской стороны' над сервером. – Rayon

Смежные вопросы