Jquery вывод даты. JavaScript Получить текущее время и дату
На этом уроке мы познакомимся с объектом Date языка JavaScript и научимся его использовать на практике.
Объект DateОбъект Date представляет собой точку на оси времени и предназначен для хранения даты и времени с точностью до миллисекунды.
Объект Date можно создавать различными способами:
- Без параметров (хранит дату и время, которая была в момент создания объекта на локальном компьютере); var newDate = new Date(); alert(newDate);
- С одним числовым параметром, в этом случае дата и время задаётся как количество миллисекунд, прошедших с 1 января 1970 00:00:00 UTC; // 1 год ≈ 365*24*60*60*1000 ≈ 31536000000 мс var date1 = new Date(31536000000); alert(date1);
- С одним строковым параметром, в этом случае JavaScript пытается разобрать строку с помощью метода Date.parse , т.е. преобразовать в дату. // YYYY-MM-DDThh:mm:ss.sss //Для разделения даты и времени используется символ T var str = "2015-02-24T21:23"; var date2 = new Date(str); alert(date2); //Также можно указать часовой пояс +hh:mm или -hh:mm var str1 = "2015-02-24T22:02+03:00"; var date2 = new Date(str1); alert(date2);
- Используя множество параметров перечисленных через запятую: год (4 цифры), месяц (отсчёт ведётся с 0), день (1..31), часы (0..23), минуты (0..59), секунды (0..59), миллисекунды (0..999). Причём обязательными являются только первых 2 параметра. //1 пример: только обязательные параметры //неуказанные параметры равны: число - 01, часы - 00, минуты - 00, секунды - 00, миллисекунды - 000. var date3 = new Date(2015,01); alert(date3); //2 пример //неуказанные параметры равны: секунды - 00, миллисекунды - 000. var date4 = new Date(2015,01,24,21,23); alert(date4);
- для получения отдельных компонентов даты и времени (начинаются методы с глагола get);
- для установления даты и времени (начинаются методы с глагола set);
- для преобразования даты в строку (начинаются методы с to);
- для преобразования строки в дату: метод Date.parse .
- Методы объекта Date для получения отдельных компонентов даты и времени в местном часовом поясе:
- getFullYear() - метод, который возвращает год, состоящий из 4 чисел;
- getMonth() - метод, который возвращает месяц в числовом формате: 0..11 (0 - январь, 1-февраль, 2 март, ...,11 - декабрь).
- getDate() - метод, который возвращает число месяца: 1..31;
- getHours() - метод, который возвращает количество часов: 0..23;
- getMinutes() - метод, который возвращает количество минут: 0..59;
- getSeconds() - метод, который возвращает количество секунд: 0..59;
- getMilliseconds() - метод, который возвращает количество миллисекунд: 0..999;
"); document.write("Год: " + newDate.getFullYear() + "
"); document.write("Месяц: " + newDate.getMonth() + "
"); document.write("Число: " + newDate.getDate() + "
"); document.write("---Время---" + "
"); document.write("Часы: " + newDate.getHours() + "
"); document.write("Минуты: " + newDate.getMinutes() + "
"); document.write("Секунды: " + newDate.getSeconds() + "
"); document.write("Миллисекунды: " + newDate.getMilliseconds() + "
"); - Методы объекта Date для получения отдельных компонентов даты и времени в UTC: getUTCFullYear() , getUTCMonth() , getUTCDate() , getUTCHours() , getUTCMinutes() , getUTCSeconds() , getMilliseconds() . Данные методы аналогичны предыдущим методам, за исключением того что они возвращают дату и время в UTC.
- Метод getTime() . Он предназначен для возвращения количества миллисекунд, прошедших с 01.01.1970 00:00:00 UTC.
- Метод getTimezoneOffset() . Он предназначен для возвращения разницы в минутах между часовым поясом локального компьютера и UTC.
- Методы объекта Date для установления отдельных компонентов даты и времени в местном часовом поясе:
- setFullYear() - метод, который устанавливает год. Кроме этого, данный метод имеет ещё 2 необязательных параметра, с помощью которых Вы можете дополнительно установить месяц и число. var newDate = new Date(); //установить для newDate с помощью метода setFullYear: год - 2014. newDate.setFullYear(2014); //установить для newDate с помощью метода setFullYear: год - 2014, месяц - 08 (сентябрь, т.к. отсчёт ведётся с 0). newDate.setFullYear(2014,08); //установить для newDate с помощью метода setFullYear: год - 2014, месяц - 08 (сентябрь), число - 20. newDate.setFullYear(2014,08,20);
- setMonth() - метод, который устанавливает месяц в числовом формате: 0..11 (0 - январь, 1-февраль, 2 март, ...,11 - декабрь). Кроме этого, данный метод имеет ещё 1 необязательный параметр, с помощью которого Вы можете дополнительно установить число. var newDate = new Date(); //установить для newDate с помощью метода setMonth: месяц - 05 (июнь). newDate.setMonth(05); //установить для newDate с помощью метода setMonth: месяц - 05 (июнь), число - 15. newDate.setMonth(05,15);
- setDate() - метод, который устанавливает число. var newDate = new Date(); //установить для newDate с помощью метода setDate: число - 28. newDate.setDate(28);
- setHours() - метод, который устанавливает количество часов: 0..23. Кроме этого, данный метод имеет ещё 3 необязательных параметра, с помощью которых Вы можете дополнительно установить минуты, секунды и миллисекунды. var newDate = new Date(); //установить для newDate с помощью метода setHours: часы - 13. newDate.setHours(13); //установить для newDate с помощью метода setHours: часы - 13, минуты - 20. newDate.setHours(13,20); //установить для newDate с помощью метода setHours: часы - 13, минуты - 20, секунды - 37. newDate.setHours(13,20,37); //установить для newDate с помощью метода setHours: часы - 13, минуты - 20, секунды - 37, миллисекунды - 230. newDate.setHours(13,20,37,230);
- setMinutes() - метод, который устанавливает количество минут: 0..59. Кроме этого, данный метод имеет ещё 2 необязательных параметра, с помощью которых Вы можете дополнительно установить секунды и миллисекунды. var newDate = new Date(); //установить для newDate с помощью метода setMinutes: минуты - 37. newDate.setMinutes(37); //установить для newDate с помощью метода setMinutes: минуты - 37, секунды - 12. newDate.setMinutes(37,12); //установить для newDate с помощью метода setMinutes: минуты - 37, секунды - 12, миллисекунды - 710. newDate.setMinutes(37,12,710);
- setSeconds() - метод, который возвращает количество секунд: 0..59. Кроме этого, данный метод имеет один необязательный параметр, с помощью которого Вы можете дополнительно установить миллисекунды. var newDate = new Date(); //установить для newDate с помощью метода setSeconds: секунды - 40. newDate.setSeconds(40); //установить для newDate с помощью метода setSeconds: секунды - 40, миллисекунды - 105. newDate.setSeconds(40,105);
- setMilliseconds() - метод, который устанавливает количество миллисекунд: 0..999. var newDate = new Date(); //установить для newDate с помощью метода setMilliseconds: миллисекунды - 318. newDate.setSeconds(318);
- Методы объекта Date для установления отдельных компонентов даты и времени в UTC: setUTCFullYear() , setUTCMonth() , setUTCDate() , setUTCHours() , setUTCMinutes() , setUTCSecondes() , setUTCMilliseconds() . Данные методы аналогичны предыдущим методам, за исключением того что они устанавливают дату и время в UTC.
- Метод setTime() . Он предназначен для установления даты и времени посредством сложения или вычитания количества миллисекунд от даты 01.01.1970 00:00:00 UTC.
Примечание: Если Вам необходимо установить дату и время в UTC, то можете воспользоваться методом Date.UTC:
//1 пример var date1 = Date.UTC(2015,1,1); var date2 = new Date(date1); alert(date2.toUTCString()); //2 пример var newDate = new Date(Date.UTC(2015,1,1)); alert(newDate.toUTCString());
Методы объекта DateМетоды объекта Date можно разделить на следующие категории:
Примечание: В JavaScript некорректно установленная дата приводит не к ошибкам, а лишь к тому, что она автоматически распределяется по остальным компонентам объекта Date.
Например, при установлении даты newDate.setFullYear = new Date(2015,01,40) (т.е. 40.01.2015) ошибки не произойдёт. Число 40 распределится следующим образом: 9 февраля 2015 года (т.к. в январе 31 день, то число будет равно 9 (40-31), а месяц +1).
//Пример 1: прибавим к дате 7 дней var date1 = new Date(2015,02,26,22,03); date1.setDate(date1.getDate()+7); //Пример 2: отнимем от даты 120 секунд var date2 = new Date(2015,02,26,22,03); date2.setSeconds(date1.getSeconds()-120); //Пример 3: последнее число предыдущего месяца var date3 = new Date(2015,02,26,22,03); date3.setDate(0);
Преобразования даты в строкуВ JavaScript существует огромное количество методов, предназначенных для перевода даты в строку.
Первую группу составляют методы, результат которых зависит от используемого браузера. Т.е. формат возвращаемой строки зависит от производителя браузера.
- Методы, которые преобразуют дату в строку с учётом часового пояса и языка локального компьютера.
- toLocaleString() - возвращает строку, содержащую дату и время;
- toLocaleDateString() - возвращает строку, содержащую дату;
- toLocaleTimeString() - возвращает строку, содержащую время.
- toUTCString() - метод, который возвращает строку, содержащую дату и время в UTC.
- toISOString() - метод, который возвращает строку, содержащую дату и время в формате ISO (YYYY-MM-DDTHH:mm:ss.sssZ).
"); document.write("toDateString() - " + date5.toDateString() + "
"); document.write("toTimeString() - " + date5.toTimeString() + "
"); document.write("toLocaleString() - " + date5.toLocaleString() + "
"); document.write("toLocaleDateString() - " + date5.toLocaleDateString() + "
"); document.write("toLocaleTimeString() - " + date5.toLocaleTimeString() + "
"); document.write("toUTCString() - " + date5.toUTCString() + "
"); document.write("toISOString() - " + date5.toISOString() + "
"); Метод для преобразования строки в дату
JavaScript для преобразования строки в дату использует метод Date.parse() . Этот метод может преобразовать строку, если она выполнена в соответствии со стандартом RFC2822 или ISO 8601.
В этом уроке рассмотрим стандарт ISO 8601, в котором строка должна иметь следующий формат: YYYY-MM-DDThh:mm:ss.sssZ .
- YYYY – год, состоящий из 4 цифр;
- MM – месяц, состоящий из 2 цифр (01 = Январь, 02 = Февраль, и т.д.);
- DD – день месяца, состоящий из 2 цифр (01..31);
- T – символ для разделения даты и времени;
- hh – количество часов (00..23);
- mm - количество минут (00..59);
- ss - количество секунд (00..59);
- sss - количество миллисекунд (0..999);
- Z - символ, который означает, что время задаётся в формате UTC. Если Вам необходимо вместо UTC установить часовой пояс, то букву " Z " следует заменить значением +hh:mm или -hh.mm .
Если строка, содержащая дату и время, задана не в формате RFC2822 или ISO 8601, то метод JavaScript Date.parse() всё равно может выполнить её преобразование, но результат в этом случае могут оказаться непредсказуемым.
Для работы с датой и временем в JavaScript существует специальный объект - Date. Этот объект поддерживается практически всем версиями JavaScript, а зачит им можно пользоваться не оглядываясь на проблемы совместимости.
Дата и время в объекте Date хранятся не в явном виде, а как и в большинстве языков программирования - в виде количества миллисекунд, прошедших с дня рождения Unix, т.е. с 0 часов 0 минут 1 января 1970 года. Отличительная особенность объекта Date - все диапазонные значения имеют индексы, начинающиеся с нуля. Это означает, что январь будет иметь индекс 0 (месяц №0), а декабрь будет не двенадцатым, а одиннадцатым месяцем. То же самое справедливо и для дней недели, часов, минут и пр.
Создать объект Date очень просто:
// текущая дата-время var date = new Date(); // дата-время из строки или числа var date = new Date(дата); // дата-время из отдельных значений var date = new Date(год, месяц, день, час, минута, секунда, миллисекунда);
Объект Date обладает рядом очень полезных методов, позволяющих работать с отдельными компонентами даты-времени, а так же проводить проверку коррестности и правильный вывод даты в заданном формате.
Методы получения компонентов даты-времени | |
getFullYear | Возвращает год (например, 2011). |
getYear | Возвращает год. Назначение метода getYear аналогично назначению getFullYear, однако данный метод является устаревшим и не рекомендуются к использованию, т.к. результаты его работы не однозначны: для диапазона дат от 1900 до 1999 года метод возвращает номер года в столетии (двузначный, например 77), а для дат за пределами этого диапазона - возвращается полное значение (четырёхзначное, например 2009). |
getMonth | Возвращает месяц. |
getDate | Возвращает день месяца (число в месяце). |
getHours | Возвращает час. |
getMinutes | Возвращает минуту. |
getSeconds | Возвращает секунду. |
getMilliseconds | Возвращает миллисекунду. |
getDay | Возвращает номер деня недели. |
getTime | Возвращает миллисекундное смещение, хранимое объектом. |
Методы изменения компонентов даты-времени | |
setFullYear | Устанавливает год. |
setYear | Устанавливает год. Назначение метода setYear аналогично назначению setFullYear, однако данный метод является устаревшим и не рекомендуются к использованию (так же как и метод getYear). |
setMonth | Устанавливает месяц. |
setDate | Устанавливает дату в месяце (день месяца). |
setHours | Устанавливает час. |
setMinutes | Устанавливает минуту. |
setSeconds | Устанавливает секунду. |
setMilliseconds | Устанавливает миллисекунду. |
setTime | Устанавливает миллисекундное смещение относительно 00:00:00 01.01.1970 |
Фунции форматирования и вывода даты-времени | |
toString | Возвращает строковое представление даты и времени. |
toUTCString | Возвращает строковое представление даты и времени с пересчётом на время UTC. Формат возвращаемой строки учитывает все интернет-стандарты. |
toGMTString | Возвращает строковое представление даты и времени с пересчётом на время GMT (время по Гринвичу). Формат возвращаемой строки учитывает все интернет-стандарты. |
toLocaleString | Аналог toString, но возвращает строковое представление даты и времени, отформатированное в соответствии с настройками локализации данного пользователя. |
toTimeString | Возвращает строковое представление времени (строка содержит только время). |
toDateString | Возвращает строковое представление даты (строка содержит только дату). |
toLocaleTimeString | Аналог toTimeString, но возвращает строковое представление времени, отформатированное в соответствии с настройками локализации пользователя. |
toLocaleDateString | Аналог toDateString, но возвращает строковое представление даты, отформатированное в соответствии с настройками локализации пользователя. |
Дополнительные функции | |
getTimezoneOffset | Возвращает смещение локального времени на компьютере пользователя относительно времени UTC. Смещение возвращается в минутах. |
parse | Функция позволяет проверить корректность даты-времени, записанных в виде строки. Если строка корректная - сразу будет создан объект Date. |
Так же объект Date содержит ряд методов для работы с UTC-датами. Эти функции полностью аналогичны уже рассмотреным, но содержат в имени префикс "UTC" и работают только с "универсальным" временем: getUTCSeconds, setUTCFullYear и т.д.
Рассмотрим пример работы с датами:
var tmp = new Date(now.getTime()); var arrNames = new Array("Сегодня", "Завтра", "Через 1 год 6 месяцев 15 дней"); var arrNormal = new Array(); var arrLocal = new Array(); var arrUTC = new Array(); // сейчас arrLocal = tmp.toLocaleString(); arrNormal = tmp.toString(); arrUTC = tmp.toUTCString(); // завтра tmp.setDate(tmp.getDate() + 1); arrLocal = tmp.toLocaleString(); arrNormal = tmp.toString(); arrUTC = tmp.toUTCString(); // через 1 год 6 месяцев 15 дней tmp.setFullYear(tmp.getFullYear() + 1); tmp.setMonth(tmp.getMonth() + 6); tmp.setDate(tmp.getDate() + 15); arrLocal = tmp.toLocaleString(); arrNormal = tmp.toString(); arrUTC = tmp.toUTCString(); // выводим результаты в таблицу document.write("
Дата | " + "Локализованная | " + "Не локализованная | " + "UTC |
" + arrNames[i] + " | + "" + arrLocal[i] + " | + "" + arrNormal[i] + " | + "" + arrUTC[i] + " | + "
А вот результат работы этого скрипта:
Как видите, представление даты существенно отличается в зависимости от используемого формата. Поэтому при работе с датой-временем надо придерживаться нескольких простых правил:
1. По возможности пользоваться UTC или GMT-форматами. Особенно это важно при создани распределённых решений (например, клиентов платёжных систем). Использование общего опорного времени даст вам гарантии (пусть и не стопроцентные), что и вы и ваш удалённый партнёр будете одинаково интерпретировать получаемые данные.
2. Локализованные дату и время имеет смысл использовать только при выводе их пользователю. Во всех остальных случаях от локализованных данных лучше отказаться.
3. Если всё же приходится использовать локальные дату и время - не забывайте учитывать смещение локального времени относительно опорного (UTC или GMT).
Следование этим правилам избавит вас от большинства логических багов и недочётов, а значит сделает ваш код более стабильным и качественным.
Объект Date позволяет работать с датами и временем. Для создания нового объекта Date используется следующий синтаксис:
New Date()
Даты хранятся в нём как количество миллисекунд, прошедших с полуночи 1 января 1970 г. согласно единому всемирному времени (UTC). Благодаря такому формату с помощью Date можно точно представлять даты, отстоящие от 1 января 1970 г. на 285616 лет.
Если конструктор Date вызывается без аргументов, создаётся объект с текущими значениями даты и времени. Для создания объекта Date с определенной датой или временем, необходимо будет передать один из четырех возможных параметров:
- миллисекунды: значение должно быть числом миллисекунд с 01.01.1970 var birthDate = new Date(8298400000); document.write(birthDate);
- строка с датой: любая дата в формате поддерживаемом методом parse() var birthDate = new Date("April 16, 1975"); document.write(birthDate);
- год, месяц, день
var birthDate = new Date(1975, 4, 28);
document.write(birthDate);
Обратите внимание, что число 4 соответствует маю месяцу. Это значит, что январю соответствует число 0. Аналогичным образом вычисляются и дни, только нулю в этом случае соответствует воскресенье.
- год, месяц, день, час, минуты, секунды, миллисекунды
При работе с объектом Date важно помнить, что вычисления выполняются с использованием единого всемирного времени (UTC), несмотря на то, что ваш компьютер может отображать время в соответствии с вашей временной зоной.
МетодыgetDate() | Возвращает день месяца (от 1 до 31) для указанной даты по местному времени. |
getDay() | Возвращает день недели (от 0 до 6; 0 = воскресенье, 1 = понедельник и т.д.) для указанной даты по местному времени.. |
getFullYear() | Возвращает год (четыре цифры). |
getHours() | Возвращает час (от 0 до 23). |
getMilliseconds() | Возвращает миллисекунды (от 0 до 999). |
getMinutes() | Возвращает минуты (от 0 до 59). |
getMonth() | Возвращает месяц (от 0 до 11; 0 = январь, 1 = февраль и т.д.). |
getSeconds() | Возвращает секунды (от 0 до 59). |
getTime() | Возвращает количество миллисекунд, прошедших с полуночи 01.01.1970. |
getTimezoneOffset() | Возвращает разницу во времени между временем UTC и местным временем, в минутах. |
getUTCDate() | Возвращает день месяца по всемирному времени (от 1 до 31). |
getUTCDay() | Возвращает день недели по всемирному времени (от 0 до 6). |
getUTCFullYear() | Возвращает год по всемирному времени (четыре цифры). |
getUTCHours() | Возвращает час по всемирному времени (от 0 до 23). |
getUTCMilliseconds() | Возвращает миллисекунды по всемирному времени (от 0 до 999). |
getUTCMinutes() | Возвращает минуты по всемирному времени (от 0 до 59). |
getUTCMonth() | Возвращает месяц по всемирному времени (от 0 до 11). |
getUTCSeconds() | Возвращает секунды по всемирному времени (от 0 до 59). |
parse() | Анализирует строку даты (например, "21 мая 1992 года") и возвращает строку со значением даты, которая содержит число в миллисекундах с 1 января 1970 00:00:00. |
setDate() | Устанавливает день месяца для указанной даты по местному времени (от 1 до 31). |
setFullYear() | Устанавливает год (четыре цифры). |
setHours() | Устанавливает часы для указанной даты по местному времени (от 0 до 23). |
setMilliseconds() | Устанавливает миллисекунды для указанной даты по местному времени. |
setMinutes() | Устанавливает минуты (от 0 до 59). |
setMonth() | Устанавливает месяц (от 0 до 11). |
setSeconds() | Устанавливает секунды (от 0 до 59). |
setTime() | Устанавливает дату в миллисекундах после (или до) 01.01.1970. |
setUTCDate() | Задает день месяца. |
setUTCFullYear() | Устанавливает год по всемирному времени (четыре цифры). |
setUTCHours() | Устанавливает час для указанной даты по всемирному времени. |
setUTCMilliseconds() | Задает миллисекунды для указанной даты по всемирному времени. |
setUTCMinutes() | Устанавливает минуты для указанной даты по всемирному времени. |
setUTCMonth() | Задает месяц для указанной даты по всемирному времени. |
setUTCSeconds() | Устанавливает секунды для указанной даты по всемирному времени. |
toDateString() | |
toISOString() | Преобразует дату в строку, используя стандарт ISO 8601. |
toJSON() | Возвращает дату в виде строки, отформатированную как дата JSON. |
toLocaleDateString() | |
toLocaleTimeString() | Возвращает часть даты в виде строки, с представлением даты на основе параметров системы. |
toLocaleString() | Возвращает дату в виде строки, с представлением даты на основе параметров системы. |
toString() | Возвращает строку, представляющую указанный объект Date. |
toTimeString() | Возвращает часть даты в виде строки. |
toUTCString() | Преобразует дату в строку, используя часовой пояс UTC. |
UTC() | Принимает те же параметры, что и длинная форма конструктора (т.е. 2-7) и возвращает количество миллисекунд с 1 января 1970, 00:00:00 UTC. |
valueOf() | Возвращает примитивное значение объекта Date. |
- JavaScript
Редкому программисту случается избежать работы с датой и временем. Вообще, дата/время - базовое понятие и в основной массе языков существуют встроенные механизмы работы с этим типом данных. Казалось бы, JS не исключение, есть встроенный тип Date, есть куча функций в прототипе, однако…
Кто виноват Первая проблема возникает когда нужно задать дату/время в тайм-зоне отличной от UTC и от локальной. Конструктор Date не имеет такого параметра.New Date();
new Date(value);
new Date(dateString);
new Date(year, month[, day[, hour[, minute[, second[, millisecond]]]]]);
Единственный вариант, где можно указать смещение относительно UTC - третий способ. Вызов конструктора в этом формате позволяет передать смещение как часть строки:
New Date("Sun Feb 01 1998 00:00:00 GMT+0700")
Строка принимается в формате RFC2822, весьма неудобном и трудном к ручному вводу. Получить такую строку из пользовательского ввода практически невозможно. Я не могу себе представить человека, который бы согласился вводить дату в таком формате.
Не смотря на то, что в Date можно установить все параметры по отдельности для таймзоны UTC - проблемы это не решает – таймзона останется локальной. Но это не единственная проблема.
Смещение относительно UTC - не константа. Это функция от даты, времени (ну или от таймштампа, если угодно) и, опять же, тайм-зоны. Например, для Москвы последний перевод времени даёт:
New Date(2014, 9, 25, 0, 0, 0); // 26.10.2014, 21:00:00 GMT+3
new Date(2014, 9, 27, 0, 0, 0); // 25.10.2014, 22:00:00 GMT+4
Таким образом, конструктор в третьем варианте становится практически бесполезным поскольку смещение нужно знать заранее. А оно, как было сказано, так просто получено быть не может. Единственная библиотека, из попавшихся мне, которая использует базу данных Олсона для обсчета сдвигов - timezone-JS . Проблема использования этой библиотеки в том, что низлежащие библиотеки (date/time picker-ы) про неё ничего не знают и внутри активно используют стандартный Date. Остальные библиотеки, работающие с объектом Date, явно на эту базу не ссылаются и обновления из нее не получают. (Поправьте меня в комментариях.)
В бизнес применении тайм-зоны имеют смысл только если заданы дата и время. К примеру, если рабочий день начинается в 9:00, то вряд ли вы ожидаете что ваш коллега из Владивостока начнет работать в 15:00. Таймзоны учитываться не должны и в таком случае отображать дату нужно в UTC. Однако, в случае с регулярными событиями, происходящими в один момент времени в разных часовых поясах, таймзона все таки нужна. К примеру, ваш ежедневный скрам начинается в 10:00 для вас и в 13:00 для Новосибирска. Между прочим, в этом как раз и есть разница между GMT и UTC. UTC – это время без смещения, а GMT – это время со смещением 0. Поясню на примере:
31.12.2014, 20:59:59 GMT в Московском часовом поясе должно выглядеть как 31.12.2014, 23:59:59
31.12.2014, 20:59:59 UTC в Московском часовом поясе должно выглядеть как 31.12.2014, 20:59:59
Из-за этой арифметики их в основном и путают. К сожалению, напутано с этим параметром повсеместно. Отсутствие прямого указания таймзоны в JS трактуется как локальная таймзона, а указание UTC и GMT равнозначно.
В ситуации мог бы помочь Intl . Мог бы, но не обязан. В частности, там есть такой параметр timeZone, но, чуть далее стандартом определено: The time zone to use. The only value implementations must recognize is «UTC». В настоящее время кроме Chrome не один браузер произвольные таймзоны не поддерживает.
С диапазонами времени в JS все совсем плохо - ничего подобного в языке нет. Хочешь сделать хорошо – делай сам.
- Вариант 1.Не использовать произвольную таймзону. Вариант предпочтительный и, наверное, самый безболезненный. То есть, у вас есть только локальная таймзона и UTC. Для этих случаев во всех браузерах вроде как всё есть, пусть и не очень удобно. К тому же, таймзона выставляется глобально для ОС и менять ее для конкретного web-приложения некошерно.
- Вариант 2.Если произвольные таймзоны необходимы - не использовать таймштамп. Совсем. Храните время в сберегательной кассе в RFC строке с указанием таймзоны. Не уверен что это поможет победить сдвиги таймзоны в кроссбраузерном понимании, но, как минимум, Chrome о таких сдвигах в курсе.
- Вариант 3.Ситуации бывают разные и случается так, что в базу время записывается с какого ни будь устройства. То есть в виде таймштампа. Тут бежать некуда, что бы корректно отобразить время нужно знать либо таймзону устройства, либо таймзону пользователя, либо и того и другого и обсчитывать все сдвиги врукопашную. Без использования базы Олсона тут не обойтись.
Тут должна быть мораль сей басни, но добавить мне пока больше нечего. В черновиках стандарта ECMA я никаких подвижек не наблюдаю, наверное, их и не будет.
Для работы с датой и временем применяется встроенный объект Date . Этот объект не имеет свойств, но обладает несколькими методами, позволяющими устанавливать и изменять дату и время.
Объект Date создается с помощью оператороа new и конструктора - Date .
Например:
var myData=new Date();
Значением переменной myData будет текущая дата и время:
Методами объекта Date можно получать отдельно значения месяца, дня недели, часов, минут и секунд:
- getDate - возвращает число в диапазоне от 1 до 31, представляющее число месяца.
- getHours - возвращает час суток в диапазоне от 0 (полночь) до 23.
- getMinutes - возвращает минуты в диапазоне от 0 до 59.
- getSeconds - возвращает секунды в диапазоне от 0 до 59.
Javascript дата
Теперь напишем саму функцию nTime() :
function nTime(obj) { var t=new Date(); var h=t.getHours(); var m=t.getMinutes(); var s=t.getSeconds(); var result=h+":"+m+":"+s; obj.res.value=result; }
* как вы помните методы отделяются от объекта точкой, об этом мы говорили в уроке 3 * Как видите, все просто. Сначала определяем текущее время, а потом с помощью методов извлекаем из него отдельные значения часов, минут и секунд.Здесь еще хочется пояснить строку var result=h+":"+m+":"+s . Впервые мы столкнулись с необходимостью выводить в результат, как значения переменных, так и простой текст. В принципе ничего сложного: переменные пишутся как есть, текст берется в кавычки, а знак + осуществляет операцию конкатенации, т.е. их объединения.
В нашем примере остался один недочет, мы хотели, чтобы время выводилось в формате "чч:мм:сс", а сейчас оно выводится в формате "ч:м:с". Т.е., в 5 утра, время будет отображаться как "5:0:0", а хотелось бы так: "05:00:00" (что более привычно). В качестве домашнего задания можете попробовать это исправить. Например, с помощью оператора if и строкового литерала "0" (идея проста: если часов меньше 10, то в результат перед h написать "0" и так со всеми переменными).
А пока продолжим изучать методы объекта Date :
- getDay - возвращает день недели, как целое число от 0 (воскресенье) до 6 (суббота).
- getMonth - возвращает номер месяца в году, как целое число от 0 (январь) до 11 (декабрь).
- getYear
- возвращает год в виде двух последних цифр (getFullYear
- возвращает год в виде четырех цифр).
* К сожалению, начиная с 2000 года, есть проблема с отображением года в разных браузерах. Метод getYear в IE отображает полный год (вместо двух последних цифр), а FireFox вместо XX отображает 1XX (т.е. подставляет 1). Поэтому предпочтительнее использовать метод getFullYear.
Код html-страницы будет простой:
Javascript дата
Теперь напишем саму функцию tData() :
Function tData(obj) { var s; var t=new Date(); var y=t.getFullYear(); var d=t.getDate(); var mon=t.getMonth(); switch (mon) { case 0: s="января"; break; case 1: s="февраля"; break; case 2: s="марта"; break; case 3: s="апреля"; break; case 4: s="мае"; break; case 5: s="июня"; break; case 6: s="июля"; break; case 7: s="августа"; break; case 8: s="сентября"; break; case 9: s="октября"; break; case 10: s="ноября"; break; case 11: s="декабря"; break; } var result=d+" "+s+" "+y; obj.res.value=result; }
Получилось подлиннее, чем в первом примере, т.к. приходится переводить на русский язык названия месяцев.
Рассмотренные выше методы позволяют получать дату. Если же нам потребуется установить дату, то следует использовать следующие методы:
- setDate - устанавливает число месяца в диапазоне от 1 до 31.
- setHours - устанавливает час для текущего времени в диапазоне от 0 (полночь) до 23.
- setMinutes - устанавливает минуты в диапазоне от 0 до 59.
- setSeconds - устанавливает секунды в диапазоне от 0 до 59.
- setYear - устанавливает значение года.
- setMonth - устанавливает значение месяца в диапазоне от 0 (январь) до 11 (декабрь).
- setTime - устанавливает значение объекта Date и возвращает количество миллисекунд, прошедших с 1 января 1970 года.
Var t=new Date(); var y=t.setYear(2010); var d=t.setDate(6); var mon=t.setMonth(11); ...
Задать дату можно прямо в конструкторе, указав в качестве параметра строку формата "месяц, день, год часы:минуты:секунды":
Var t=new Date("Feb,10,1975 17:45:10");
Значение часов, минут и секунд можно опустить (они будут равны нулю):
Var t=new Date("Feb,10,1975");
Эту же дату можно задать с помощью чисел, перечислив через запятую год, месяц, число, часы, минуты, секунды:
Var t=new Date(75, 1, 10, 17, 45, 10);
Или же, опуская часы, минуты и секунды (они будут равны нулю):
Var t=new Date(75, 1, 10);
* Есть проблема: IE год отображать не хочет, поэтому лучше эти варианты не использовать.Вот собственно и все, вы вполне готовы самостоятельно написать сценарий, который при загрузке страницы отобразит дату, время и день ее посещения (в нормальном русском виде). Удачи!