Js отримати поточний час. JavaScript Отримати поточний час та дату

Всім привіт!
Мені часто доводиться працювати зі статистичними даними, і там дуже багато зав'язано на датах. При цьому, одна й та сама дата може бути використана на сторінці у різних форматах (наприклад, у зручному для машини та у зручному для людини). Я думаю, що більшість із вас чудово представляють весь цей жахливий за розмірами код, який виходить при використанні об'єкта Date.
Наприклад, щоб отримати поточну дату у форматі ДД.ММ.РРРР нам потрібно зробити таке:
var d = new Date(), fd = d.getDate() + "." + (d.getMonth()+1) + "." + d.getFullYear();
А коли таких рядків стає багато? Чи легко згадати, що в JavaScript місяць починається з нуля, коли розробляєш не тільки на ньому? Або те, що тут мілісекунди, а не секунди, як майже скрізь на бекенді? Можна вирішити частину завдань популярною бібліотекою Moment.js, але вона працює дуже повільно.
Ця бібліотека вирішує ці проблеми.
Якщо цікаво, пропоную вам прочитати цей маленький огляд.

TempusJS багато в чому складається із синтаксичного цукру над об'єктом Date, тому працює дуже швидко. Синтаксис самої бібліотеки дуже простий. Наприклад, записати попередній приклад, можна так:
var fd = tempus().format("%d.%m.%Y");
Тепер про швидкість. У спойлері ви можете побачити порівняння Tempus з Moment та нативним способом форматування дати (див. вище):

Порівняння нативного JS, MomentJS та TempusJS

Отримуємо поточну дату
Native JS x 2,175,575 ops/sec ±0.75% (96 runs sampled) Moment x 284,864 ops/sec ±0.85% (96 runs sampled)
Форматування
Native JS x 1637517 ops/sec ±0.61% (100 runs sampled) Moment x 8808 ops/sec ±1.07% (100 runs sampled) Tempus x 942815 ops/sec ±0.68%
Автовизначення дати та парсинг
Native JS x 11,204,316 ops/sec ±0.81% (88 runs sampled) Moment x 38,511 ops/sec ±1.41% (95 runs sampled)
Парсинг дати за форматом
Moment x 46,293 ±0.63% (100 runs sampled) Tempus x 109,947 ±0.93%
Парсинг та валідація
Moment x 44,588 ops/sec ±1.09% (90 runs sampled)
Результати отримані на моєму ноутбуку Google Chrome 30.0.1599.114. В інших браузерах результати відрізняються, але співвідношення залишається приблизно тим самим.
Для тестів використовувалася бібліотека benchmark.js
Бенчмарки за іншими функціями ви можете побачити .

Отже, переваги даної бібліотеки можна записати наступне:

  • Підтримує IE6+, Chrome, Firefox, Opera;
  • Підтримує ланцюжки викликів;
  • Місяці можуть починатися з 1 (за замовчуванням), а чи не нуля;
  • Мілісекунди можуть бути відключені (за замовчуванням) або включені;
  • Швидка робота (Оскільки, у багатьох випадках, використовується рідний для браузера об'єкт Date, реалізація якого написана більш швидкими мовами);
  • Підтримує кастомні формати та плагіни
  • Валідація дати дуже швидка і залежить тільки від функцій, що встановлюють дату (т.к. валідація проходить вже при занесенні значень, а не вираховується окремо);
  • Мультимовність та автовизначення мови користувача.

Тут мова піде лише про деякі функції.

Форматування та парсинг

Отже, спочатку ще один приклад форматування дати. Тут ми також використовуємо ланцюжок викликів. Наприкінці кожної установки значення ми отримуємо назад об'єкт TempusDate, який можемо використовувати далі в ланцюжку. Приклад:
tempus(). // Отримуємо нову дату calc((month: -1)). // зменшуємо її на один місяць format("%d.%m.%Y"); // Виводимо у вигляді рядка
Таким чином, ми отримаємо цей же день, годину та секунду, але місяць тому. Це буває корисним для отримання звітів за останній місяць.

Наступний приклад – парсинг дати.
// Поверне об'єкт TempusDateз датою "2013-11-18" tempus("18.11.2013"); // Поверне об'єкт TempusDateз датою "2013-12-12" tempus("2013-12-12", "%Y-%m-%d"));
Tempus може автоматично визначати певні відомі формати. Також можна вказувати певний формат, тоді парсинг відбуватиметься швидше. Плюс до цього можна задавати дату, яка буде повернена, якщо парсинг завершиться невдачею:
// Т.к. "123" не підходить до формату "%d.%m.%Y", то // буде повернено об'єкт, що містить дату 2013-01-01 tempus("123", "%d.%m.%Y", tempus ());
Список форматів за промовчанням можна переглянути

А тепер змінимо формат вже відформатованої дати
// "2013-11-05" tempus("05.11.2013").format("%Y-%m-%d"); // Або так // "Октябрь, 12" tempus("2013-10-12 12:31:01", "%Y-%m-%d %H:%M:%S").format("% B %d");

Також можна використовувати локалізацію для форматування. За промовчанням буде вибрано мову користувача (беремо з браузера) або мову за замовчуванням, якщо мова користувача не виявлена ​​серед доступних мов Tempus.
// Встановлюємо мову tempus.lang("ru"); // Стандартно використовуємо format // "Листопад, 05" tempus(1383609600).format("%B, %d");
На даний момент мови всього дві - російська та англійська, так що буду радий допомоги.

Валідація

Валідація дати відбувається так:
// Поверне false tempus("32.08.2013", "%d.%m.%Y").valid(); // Поверне true tempus("00:00 01.01.2012", "%H:%M %d.%m.%Y").valid();

У разі помилки можна подивитися поля, в яких вона виникла - скрізь, де значення не false:
// Поверне ("year":-5,"month":false,"day":false,"hours":false, // "minutes":false,"seconds":false,"milliseconds":false) tempus (). year(-5). // задаємо рік=-5, тобто. невалідний errors(); // отримуємо об'єкт із помилками

Діапазони дат

Іноді потрібно отримати кількість років (наприклад, вік), місяців, днів і т.д. між двома датами. Для цього ми можемо використовувати метод between, який знаходить різницю між двома датами та повертає у потрібному форматі ("year", "month", "day", "hours", "minutes", "seconds", "milliseconds").
Ось простий приклад отримання кількості місяців між 1 листопада 2013 року та 5 травня 2014 року:
// Поверне 6 tempus().between(tempus(), "month");
Або скільки годин залишилося до нового року
tempus().between(tempus(), "hours");
В останньому прикладі можна побачити, що я вказав лише рік. При встановленні значення масивом або об'єктом нестачі значення будуть
заповнені мінімальними. Список констант з мінімальними значеннями ви можете побачити в документації.

Також, ми можемо змінити будь-яку дату, використовуючи функцію calc:
// Поверне TempusDate з датою 2012-01-01 tempus().calc((year: 1, month: -4, day: -1));

Свої формати

Застосовуємо свій формат для місяця, який може набувати значень від 1 до 12 (а не 01 до 12):
// Реєструємо новий формат tempus.registerFormat("%q", // директива - %q function(date) ( // Тут вказуємо функцію форматування, тобто, що буде підставлено замість %q return date.month(); ) , function(value) ( ​​// А тут функцію парсингу var v = Number(value); return (month: (isNaN(v) ? undefined: v) ); ), 1, // Мінімальна довжина, яку може набувати значення 2 , // Максимальна довжина "number" // Тип); // Тестуємо // Поверне "01.1.2013"; tempus((year: 2013, місяць: 1, день: 1)).format("%d.%q.%Y"); // Поверне ("year":2013,"month":2,"day":10,"hours":0,"minutes":0,"seconds":0); tempus("10.2.2013", "%d.%q.%Y").get();
При реєстрації можна помітити, деякі параметри задаються окремо, тоді як можна було б використовувати регулярне вираз. Насправді, там спочатку воно й було, але після відмови від нього швидкість виросла в кілька десятків разів.
Якщо вам потрібно видалити якийсь формат, то використовуйте unregisterFormat:
tempus.unregisterFormat("%d"); // Поверне "%d.01.2013", т.к. директиви %d не існує. tempus.format((year: 2013, місяць: 1, день: 1), "%d.%m.%Y");

Геттери/сетери

Можна отримувати/встановлювати деякі значення, використовуючи функції year(), month(), day(), hours(), minutes(), seconds(), milliseconds(), dayOfWeek(), utc(), timestamp() або set (). Наприклад:
tempus(). // Отримуємо поточну дату year(1900). // Залишаємо все як є, але встановлюємо 1900 leapYear(); // Перевіряємо, чи це високосний рік, в даному випадку false tempus().year(); // А так отримуємо поточний рік у числовому вигляді

Генерація дат

Ви можете створити дату безліччю способів, повний список параметрів знаходиться в документації. Тут наведено мінімальний приклад.
// returns ["29.03.2013", "30.03.2013", "31.03.2013", "01.04.2013", "02.04.2013"]; tempus.generate(( dateFrom: "20130329", formatFrom: "%Y.%m.%d", dateTo: "20130402", період: (day: 1), format: "%d.%m.%Y") ));
Це може бути корисно для відображення графіків за датами та зміна формату відображення прямо на клієнті, без запитів до бекенду. Дата може бути згенерована як масив, так і як об'єкти, де як ключі будуть самі дати (це корисно, коли нам потрібно до будь-якої дати прив'язати якусь подію, наприклад, коли робимо свій календар). Також, дати можуть бути згруповані за днями, тижнями, місяцями, годинами, роками - за будь-чим. Це також може бути застосовано до календаря.

Плагіни

Ну і останнє – плагіни. Тут ми розширюємо фабрику для генерації випадкової дати. Також нам знадобиться клас TempusDate, його можна знайти в tempus.classes(). Ось приклад плагіна:
(function (tempus) ( var TempusDate = tempus.classes("TempusDate"); tempus.randomDate = function() ( var date = new TempusDate(); date.year(Math.floor((Math.random()*)) tempus.MAX_YEAR - tempus.MIN_YEAR)) + tempus.MIN_YEAR)).month(Math.floor((Math.random()*(tempus.MAX_MONTH - tempus.MIN_MONTH)) + tempus.MIN_MONTH)). floor((Math.random()*(date.dayCount() - tempus.MIN_DAY)) + tempus.MIN_DAY)) hours(Math.floor((Math.random()*) ) + tempus.MIN_HOURS)) minutes(Math.floor((Math.random()*(tempus.MAX_MINUTES - tempus.MIN_MINUTES)) + tempus.MIN_MINUTES)) seconds(Math.floor((Math.random() *(tempus.MAX_SECONDS - tempus.MIN_SECONDS)) + tempus.MIN_SECONDS));return date; ); ))(tempus); // Тепер ми можемо створювати дати так var someRandomDate = tempus.randomDate();
Думаю, що у такий спосіб можна буде зручно писати віджети, використовуючи зв'язку jQuery+Tempus, Angular+Tempus тощо.

Вихідники

Встановити можна, завантаживши вихідники з гітхабу:
https://github.com/crusat/tempus-js/releases
Або через bower:
$ bower install tempus
Вам потрібно лише один файл - tempus.js або tempus.min.js.

Сподіваюся, що дана бібліотека виявиться корисною, а також цікаво було б дізнатися, чого в ній не вистачає, щоб розвивати бібліотеку в правильному напрямку. Дякую за увагу!
P.S. Дякуємо за інвайт!

Доброго часу доби всім передплатникам та читачам блогу сайт. У статті ми вивчимо вбудований об'єкт мови програмування jscript – Date.

Об'єкт JS Date призначений для роботи з датою та часом та для перетворення рядків у формат дати. При створенні класу Date jscript використовує ключове слово newі один з трьох видів конструкторів, давайте подивимося на їхній загальний синтаксис:

Клас JS DATE – дата та час

Date ()– в даному випадку буде здійснено виведення поточної дати та часу js у форматі:<название дня><название месяца><дата1><время1><год>, час задається за Грінвічем, тобто з використанням UTC (UCT - Universal Coordinated Time).

Date (nMilliseconds)– Як бачимо, тут ми передаємо один параметр nMilliseconds, який задає дату1 у мілісекундах, рахуючи від 1 січня 1970 року

Date (year, month, date [, hours [, min [, sec [, ms]]]])– Тут ми бачимо, що конструктору передаються кілька параметрів, що дозволяє задати вручну всі значення дати та часу js:

  • year- Рік у чотиризначному форматі, наприклад 1998 (але не 98).
  • month- Номер місяця від 0 (січень) до 11 (грудень).
  • date- Календарна дата1 у діапазоні від 1 до 31.
  • hours- година дня в діапазоні від 0 до 23.
  • min- Хвилини в діапазоні від 0 до 59.
  • sec– Кількість секунд від 0 до 59.
  • ms– Число мілісекунд у діапазоні від 0 до 999.

Добре, давайте подивимося на наступний приклад використання класу JS DATE у сценарії мовою програмування, який працює під керуванням сервера:

// Об'єкт JS Date // 1_date.js //********************************** var a, b, c //Поточна дата1 і час1 a = new Date(); //js //Період через 1000 мс після 1 січня 1970 b = new Date (1000); //Власна тимчасова дата2 c = new Date (2000, 5, 20, 12, 20, 55, 97); WScript.Echo (a + " \n "+ b + " \n "+ c);

Добре, тепер розглянь основні методи класу Date JS мови.

getFullYear()– Номер поточного року у чотиризначному форматі.

getDate()– Поверне номер поточної дати (від 1 до 31).

getMonth()– Номер поточного місяця (від 1 до 12).

getDay()- Номер дня тижня (0 для неділі, 1 - для понеділка і т. д.).

getHours ()– Кількість годин (відлік починається з півночі).

getMinutes()- Поверне кількість хвилин (відлік починається з початку години).

getSeconds()- Число секунд (відлік іде з початку хвилини).

getMilliseconds ()- Число мілісекунд.

Давайте розглянемо наступний приклад сценарію, який демонструє роботу з описаними вище методами класу Date:

//********************************** // Об'єкт JS Date // 2_date.js //********************************** var js_new_date=new Date; //js var gFullYear, gDate, gMonth, gDay, gHours, gMinutes, gSeconds, gMilliseconds, MyArr, index, list="" ; gFullYear = "Рік \t \t "+js_new_date.getFullYear(); gDate = "Дата \t \t "+js_new_date.getDate(); gMonth = "Місяць \t \t "+js_new_date.getMonth(); gDay = "День тижня t"+ js_new_date.getDay(); gHours = "Годинник \t \t "+js_new_date.getHours(); gMinutes = "Хвилини \t \t "+js_new_date.getMinutes(); gSeconds = "Секунди \t \t "+js_new_date.getSeconds(); gMilliseconds = "Міллісекунди\t"+js_new_date.getMilliseconds(); //Зберігаємо все в масиві MyArr = [ gFullYear, gDate, gMonth, gDay, gHours, gMinutes, gSeconds, gMilliseconds] для (var index in my_arr) ( list+= MyArr[ index] + " \n "

Бачимо, що тут ми оголосили ряд змінних jscript, які зберігають значення, що повертаються функціями класу Date() JS мови, далі всі перемінні ми прописали в масив MyArr (детальний опис масивів є в статті " "), доступ до нього здійснюється через цикл for in (цей цикл я описав у статті " "). Наприкінці ми виводимо список значень всім змінних.

getTime()- Кількість мілісекунд, що пройшли з 1 січня 1970 року. Він ідеально підходить для обчислення часу роботи блоку коду.

//********************************** // js date // Метод getTime() // 3_date.js //********************************** var to_time, end_time, time_elapsed, summ = 0; // Початок to_time = (new Date ()). getTime (); for (var i = 0; i<= 100000 ; i++ ) { summ+= i; } //Конец end_time = (new Date () ) .getTime () ; // Час виконання циклу time_elapsed = end_time - to_time; WScript.Echo ( "Цикл виконувався:"+ time_elapsed + "мілісекунд");

Якщо ви уважно подивіться на цей сценарій, то побачите, що ми двічі оголошували об'єкт Date у JS сценарії. Якщо цього не зробити, то функція getTime будеяк спочатку, так і в кінці циклу повертати одне значення.

getTimezoneOffset()– Поверне різницю в хвилинах щодо локального часу та універсального (за Гринвічем).

//********************************** // Об'єкт JS DATE // Метод getTimezoneOffset()// getTimezoneOffset_date.js //********************************** var time_zone, time_zone_cur //Зміщення для поточного періоду time_zone_cur = (new Date () ) .getTimezoneOffset () //js new date //Зміщення для заданої дати time_zone = (new Date (2000, 5, 20, 12, 20, 55, 97)) .getTimezoneOffset() WScript.Echo (time_zone + \n "+ time_zone_cur);

toDateString()– Дана функція об'єкта Date у js сценарії поверне рядок, який представлятиме дату2 для локального часового поясу.

toGMTString()– Аналог попередньої функції, але за основу взято часовий пояс GMT (формат часу за Гринвічем).

toLocaleDateString()- Даний метод Date мови js поверне рядок, який представлятиме дату2 для локального часового поясу відповідно до регіональних налаштувань системи.

toLocaleString()– Перетворює дату в рядок відповідно до локального часового поясу та локальних угод про форматування дат.

toLocaleTimeString()– Поверне рядок, який містить час із дати у локальному часовому поясі на основі локальних угод про форматування часу.

toString()– Перетворення дати на рядок.

toTimeString()– Перетворення часу з дати2 на строковий формат.

toUTCString()– Перетворює дату на малий формат, при цьому використовується універсальний час.

Можливо, наведені вище функції здадуться одноманітними і заплутаними. Тому, щоб не писати під кожен метод приклад, я написав простий сценарій, в якому навів приклад роботи одразу всіх методів:

//********************************** // JS DATE // Перетворення дати2 у рядок2// 4_toStr_date.js //********************************** var js_date_gettime=new Date; //js var toDS, toGMTS, toLDS, toLS, toLTS, toS, toTS, toUTCS, MyArr1, index, list=""; // js date to string toDS = js_date_gettime.toDateString(); toGMTS = js_date_gettime.toGMTString(); toLDS = js_date_gettime.toLocaleDateString(); toLS = js_date_gettime.toLocaleString(); toLTS = js_date_gettime.toLocaleTimeString(); toS = js_date_gettime.toString(); toTS = js_date_gettime.toTimeString(); toUTCS=js_date_gettime.toUTCString(); //Зберігаємо все в масиві MyArr1 = [toDS, toGMTS, toLDS, toLS, toLTS, toS, toTS, toUTCS] //Отримуємо доступ до кожного елементу масиву for (var index in my_arr) (list + = MyArr1 [index] + " \n "; ) // Виводимо список WScript.Echo (list);

Для роботи з датою та часом у 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 і т.д.

Розглянемо приклад роботи з датами:

А ось результат роботи цього скрипту:


Як бачите, подання дати істотно відрізняється залежно від формату, що використовується. Тому при роботі з датою-часом треба дотримуватися кількох простих правил:

1. По можливості користуватися UTC чи GMT-форматами. Особливо це важливо під час створення розподілених рішень (наприклад, клієнтів платіжних систем). Використання загального опорного часу дасть вам гарантії (нехай і не стовідсоткові), що і ви і ваш віддалений партнер однаково інтерпретуватиме отримані дані.

2. Локалізовану дату та час має сенс використовувати лише при виведенні їх користувачеві. В інших випадках від локалізованих даних краще відмовитися.

3. Якщо все ж таки доводиться використовувати локальні дату і час - не забувайте враховувати зсув локального часу щодо опорного (UTC або GMT).

Дотримання цих правил позбавить вас більшості логічних багів і недоліків, отже зробить ваш код більш стабільним і якісним.

Рідкісному програмісту трапляється уникнути роботи з датою та часом. Взагалі, дата/час - базове поняття й у більшості мов існують вбудовані механізми роботи з цим типом даних. Здавалося б, 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.2. :59
Через цю арифметику їх здебільшого плутають. На жаль, наплутаний з цим параметром повсюдно. Відсутність прямої вказівки таймзони JS трактується як локальна таймзона, а вказівка ​​UTC і GMT рівнозначно.

У ситуації міг би допомогти Intl. Міг би, але не зобов'язаний. Зокрема там є такий параметр timeZone, але, трохи далі стандартом визначено: The time zone to use. The only value implementations must recognize є «UTC». В даний час, крім Chrome, не один браузер довільні таймзони не підтримує.
З діапазонами часу в JS все зовсім погано – нічого подібного у мові немає. Хочеш зробити добре – роби сам.

Що робити
  • Варіант 1.
    Не використовувати довільну таймзону. Варіант кращий і, мабуть, найболючіший. Тобто, у вас є лише локальна таймзона та UTC. Для цих випадків у всіх браузерах ніби все є, нехай і не дуже зручно. До того ж, таймзона виставляється глобально для ОС і змінювати її для конкретного веб-додатка некошерно.
  • Варіант 2.
    Якщо довільні таймзони потрібні - не використовувати таймштамп. Зовсім. Зберігайте час у ощадній касі в рядку RFC із зазначенням таймзони. Не впевнений, що це допоможе перемогти зрушення таймзони в кроссбраузерном розумінні, але, як мінімум, Chrome про такі зрушення в курсі.
  • Варіант 3.
    Ситуації бувають різні і трапляється так, що в основу час записується з будь-якого пристрою. Тобто у вигляді таймштампу. Тут бігти нікуди, щоб коректно відобразити час потрібно знати або таймзону пристрою, або таймзону користувача, або того й іншого і обраховувати всі зрушення врукопашну. Без використання бази Олсон тут не обійтися.
  • Тут має бути мораль цієї байки, але додати мені поки що нічого. У чернетках стандарту ECMA я жодних зрушень не спостерігаю, напевно, їх і не буде.