Начало:

Дата и время в программировании. Часть 1 — история вопроса

Дата и время в программировании. Часть 2 — PHP и MySQL

Дата и время в Javascript

В javascript для работы со временем существует класс Date. Согласно документации, конструктор этого класса принимает несколько типов значений, а именно:

  • Unix timestamp с миллисекундами (например, 1268758800000)
  • строковое значение даты в формате RFC2822 или ISO 8601 (например, Tue Mar 16 2010 19:00:00 GMT+0200 или 2010-03-16T17:00:00.000Z)
  • год, месяц, день и, опционально, часы, минуты, секунды и миллисекунды отдельными параметрами (например, new Date(2010, 2, 16, 17, 0, 0, 0))

Обратите внимание, при передаче даты отдельными параметрами январю соответствует 0, а не 1.

Самая большая проблема при работе с датами и временем в браузере — текущее время берется с компьютера пользователя. Это может привести к ошибкам в расчетах, если клиентская и серверная часть вашего сайта тесно связаны между собой. Для решения этой проблемы можно вычислять разницу во времени между клиентом и сервером где-нибудь на ранних этапах загрузки страницы:

var cs_time_diff = <?php echo time(), '000'; ?> - Date.now();

Мы, конечно, могли бы учитывать микросекунды серверного времени, но, учитывая задержки при передаче данных между сервером и клиентом, такой точности нам не видать. Тем не менее, если поместить этот сценарий где-то в начале элемента head нашей страницы, мы получим достаточно точное значение. В дальнейшем его можно использовать при расчетах текущего серверного времени. Это будет удобно, например, для часов на javascript. Но учтите, что при изменении времени на компьютере пользователя (вручную или при синхронизации через интернет) это значение вновь станет неверным.

Для расчетов серверного времени напишем классу Date дополнительный метод:

Date.prototype.toServerTime = function() {
    return new Date(this.getTime() + cs_time_diff);
}

Теперь для получения серверного времени достаточно вызвать метод toServerTime() на экземпляре класса Date:

var now = new Date(); // Создаст новый экземпляр класса Date с текущим временем пользователя
console.log(now.toServerTime().getTime() - now.getTime() === cs_time_diff); // выведет true

Временные зоны и Javascript

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

var d1 = new Date('2010-03-16 17:00:00');
var d2 = new Date('2010-03-16 17:00:00 UTC');

console.log(d1, d2);

Этот пример выведет примерно следующее:

Tue Mar 16 2010 17:00:00 GMT+0200 (FLE Standard Time)
Tue Mar 16 2010 19:00:00 GMT+0200 (FLE Standard Time)

По этой причине, передавать временные значения с сервера на клиент необходимо с информацией о временном смещении. Javascript понимает временные зоны UTC и GMT, все остальные нужно передавать в числовом формате (+0200 и т.п.).

Для людей, которые хотят иметь полную поддержку временных зон в javascript, существует проект timezone-js. Это может пригодиться при работе с javascript на стороне сервера, например с использованием node.js.

Заключение

Работать с датой и временем в javascript достаточно просто, однако инструментарий для этой работы на текущий момент скудный. У класса Date имеется с три дюжины методов, но большинство из них — мутаторы и геттеры, а достойного аналога DateTime в PHP у javascript нет. Пока выполняемые вами задачи достаточно тривиальные, javascript справляется, однако надежной работы с датами от него ждать не стоит.

На этом цикл статей по работе с датой и временем в веб завершен, хотя тема далеко не исчерпана. Все пожелания и замечания по этим статьям можно писать в комментариях или мне на почту.