Як перетворити дату JavaScript в UTC?


590

Припустимо, користувач вашого веб-сайту вводить діапазон дат.

2009-1-1 to 2009-1-3

Цю дату потрібно надіслати на сервер для певної обробки, але сервер очікує, що всі дати та часи будуть у UTC.

Тепер припустимо, що користувач перебуває на Алясці або на Гаваях або на Фіджі. Оскільки вони знаходяться в часовому поясі, що відрізняється від UTC, діапазон дат потрібно перетворити на щось подібне:

2009-1-1T8:00:00 to 2009-1-4T7:59:59

Використовуючи об’єкт дати JavaScript, як би ви перетворили перший "локалізований" діапазон дат у те, що зрозуміє сервер?


10
Воскресив це, тому що це був найкращий хіт Google для мене, і нові браузери мають вбудовану підтримку для рядків дати UTC.
jcomeau_ictx

4
Я оновив прийняту відповідь, щоб виділити новий метод ECMAscript 5 toISOString (). Див stackoverflow.com/a/11957822/19112
dthrasher

5
значить, у 2015 році мені доведеться возитися з датами строфіфікації та розбору? смішно!
Інструментарій

2
Звичайно, є. Ви ніколи не можете розраховувати на те, що хтось зробить роботу за вас :-P Принаймні, поки світ не перестане використовувати часові пояси та не почне уніфікувати дати та години.
Erenor Paz

4
"Зоряні дані", бажано.
Майкл Дау

Відповіді:


370

toISOString()Метод повертає рядок , в спрощеному розширеному форматі ISO ( ISO 8601 ), який завжди 24 або 27 символів довжиною ( YYYY-MM-DDTHH:mm:ss.sssZабо ±YYYYYY-MM-DDTHH:mm:ss.sssZ, відповідно). Часовий пояс завжди є нульовим зміщенням UTC, як позначається суфіксом " Z".

Джерело: веб-документи MDN

Необхідний формат створюється за допомогою .toISOString()методу. Для старих веб-переглядачів (тобто 8 і нижче), які не підтримують цей метод, прошивку можна знайти тут :

Це дасть вам можливість робити те, що потрібно:

var isoDate = new Date('yourdatehere').toISOString();

Для роботи в часовій зоні , moment.js та time.js часовий пояс - це справді неоціненний інструмент ... особливо для навігації по часових поясах між клієнтом та сервером javascript.


81
насправді це перетворює об’єкт дати у рядок, не зможе робити подальші операції з датою на ньому
orszaczky

2
@TheRebel, приведений випадок використання полягає в тому, що йому потрібно надіслати серверу відформатовану рядок.
Буде Стерн

28
@ Добре, ви абсолютно праві, але - як і більшість глядачів тут, я припускаю, - я приїхав сюди, грунтуючись на заголовку, шукаючи загальну дату JS для перетворення UTC, тому я подумав, що це корисно згадати тут :)
orszaczky

4
Будьте обережні при використанні цього методу! Він не створює дату UTC - він форматує наявні дані дати як є у форматі UTC та надає часовому поясу "Z". Це неправильно 99% часу! Ви повинні перетворити дату в часовий пояс GMT перед використанням цього методу!
користувач1944491

5
@ user1944491 Я не думаю, що це правильно. Згідно з документами MDN, toISOStringправильно перетворюється на UTC [toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offsetТакож у прикладі вони показують, що зміщення враховується, коли викликається toISOString
FFF,

560

Просте і дурне

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

 return new Date(now_utc);

85
Мені сподобалась ваша ідея і я зробив метод, яким я користувався багато разів. function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
Тім

21
Найкоротший код, який я придумав, щоб отримати дату та час UTC, - відключивши часовий пояс:new Date(new Date().toUTCString().substr(0, 25))
joelvh

17
Зауважте, що getUTCMonth () повертає значення 0 до 11. Отже, якщо вам потрібен місяць за номером замість рядка, це допоможе позначити +1 до значення.
Талві Ватія

19
Це нісенітниця. Нова дата матиме інше значення, ніж ви насправді хочете. Просто використовуйте now.toUTCSTring()замість (неправильно) now_utc.toString().
Бергі

22
Я б не використовував це - використовуючи новий Date (), ви отримуєте часовий пояс броузера. у веб-переглядачах Chrome 29 та IE10 дата та час видаються правильними, але часовий пояс встановлений у часовому поясі браузера, що може спричинити проблеми ...
Sean

207

Ось мій метод:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

Отриманий utcоб'єкт насправді не є датою UTC, але місцева дата зміщена відповідно до часу UTC (див. Коментарі). Однак на практиці це робить свою роботу.


Я дивився на цю проблему, коли зрозумів, що Date.now()дає місцевий час, а не час UTC, і це рішення мені здається найпростішим. Принаймні в моєму випадку, коли я хочу UNIX час, а не добре відформатований рядок. (Єдиною різницею було те, що я помножував би 60 * 1000лише на явність :))
Timothée Boucher,

18
Додавання 60000 * Date.getTimezoneOffset () невірно! По-перше, ви повинні вважати, що всі дати / часи вже є UTC з модифікатором часового поясу для відображення. Браузери можуть відрізнятися, проте Date.getTime () повертає кількість мілісекунд з 1970-01-01. Якщо ви створили нову дату за допомогою цього номера, наприклад: нова дата (Date.getTime ()); це буде UTC , проте коли ви його покажете (наприклад: через консоль інструментів хромованого розробника), він виявиться вашим локальним часовим поясом.
Аарон Гофман

15
У моєму браузері це створює DateTime, який не є UTC. Однак, коли відображається в моєму браузері, це відображає DateTime у моєму локальному часовому поясі, який би був правильним часом UTC, якщо інформація про часовий пояс ігнорується.
Аарон Гофман

Є, цікавий момент. Давайте порівняємо now.toString()з utc.toString(): немає зміни часового поясу, але час зміни, які абсолютно інша справа. Однак більш чисте рішення було б набагато складнішим (я думаю, що так), і цей код виконує цю роботу у переважній більшості випадків, доки ніхто не буде мати справу з часовими поясами. Це змусило мене нагадати про штампування качки : різна річ, але змушена вести себе однаково. Також зверніть увагу, що код DrunkCoder має той самий випуск.
Гра "Двійник"

4
Ця відповідь демонструє ще одну загальну реалізацію "зрушення епохи", що є небезпечним ізольовано, оскільки може провалитись біля крайових випадків, таких як переходи DST. Не рекомендовано.
Метт Джонсон-Пінт

25
Date.prototype.toUTCArray= function(){
    var D= this;
    return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
    D.getUTCMinutes(), D.getUTCSeconds()];
}

Date.prototype.toISO= function(){
    var tem, A= this.toUTCArray(), i= 0;
    A[1]+= 1;
    while(i++<7){
        tem= A[i];
        if(tem<10) A[i]= '0'+tem;
    }
    return A.splice(0, 3).join('-')+'T'+A.join(':');    
}

Це добре працює. Мені просто потрібно було замінити "-" дати в моєму джерелі на "/", щоб створити дату JavaScript, тоді я міг би зателефонувати на вашу функцію toISO (), щоб отримати правильний вихід.
dthrasher

це чудово працює. Ви також можете подати результат у jQuery $ .parseDate (...), щоб повернути об’єкт дати назад, який був зміщений на UTC.
Брайан Елліс

23

Перетворити на ISO без зміни дати / часу

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

Перетворити на ISO із зміною дати / часу (дата / час буде змінено)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

Посилання на скрипку


значить, це свого роду підробка UTC? Я зміщую свою місцеву дату, і мені вдається подати на сервер дату і час, які я насправді бачу на своєму годиннику ПК. Ого. У будь-якому разі краще, ніж підкреслювати та аналізувати
Інструментарій

Також вам не потрібен .toISOString (), ви можете просто надіслати isoDate на сервер
Інструментарій

.toISOString () є простим і прямим, виведення дати з нього буде додатковим кроком (isoDate не є функцією).
RollerCosta

Чи не потрібно додавати зміщення замість віднімання? Зверніться до stackoverflow.com/a/11964609/832230
Акаменус

@ABB Якщо поточне зміщення часового поясу становить + ve, ми повинні відняти його (у нашому випадку IST становить +5: 30), інакше додати.
RollerCosta

18

Браузери можуть відрізнятися, і ви також повинні пам’ятати, щоб не довіряти будь-якій інформації, що генерується клієнтом, але, як було сказано, наведене нижче твердження працює для мене (Google Chrome v24 на Mac OS X 10.8.2)

var utcDate = new Date(new Date().getTime());


редагувати: "Чим це відрізняється від просто new Date()?" дивіться тут: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

  • Якщо аргументів не надано, конструктор створює об’єкт Date JavaScript для поточної дати та часу відповідно до системних налаштувань.
  • Примітка: Якщо Date викликається конструктором з більш ніж одним аргументом, вказані аргументи представляють місцевий час. Якщо потрібен UTC, використовуйте нову дату ( Date.UTC (...) ) з тими ж аргументами. (Примітка: Date.UTC () повертає число мілісекунд з 1970-01-01 00:00:00 UTC)

Додавання 60000 * Date.getTimezoneOffset (), як зазначено в попередніх відповідях, невірно. По-перше, ви повинні вважати, що всі дати / часи вже є UTC з модифікатором часового поясу для відображення.

Знову ж таки, браузери можуть відрізнятися, проте Date.getTime () повертає кількість мілісекунд з 1970-01-01 по UTC / GMT. Якщо ви створите нову дату, використовуючи цей номер, як я роблю вище, це буде UTC / GMT. Однак, якщо ви відображаєте його за допомогою виклику .toString (), він виявиться у вашому локальному часовому поясі, оскільки .toString () використовує ваш локальний часовий пояс, а не часовий пояс об'єкта Date, на який він викликається.

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

У моєму браузері додавання 60000 * Date.getTimezoneOffset () створює DateTime, який не є UTC . Однак, коли відображається в моєму браузері (наприклад: .toString ()), він відображає DateTime у моєму локальному часовому поясі, який би був правильним часом UTC, якщо інформація про часовий пояс ігнорується.


11
Я щойно запустив цей код на Fx та Chrome, він, схоже, не працює: результат точно такий же, як і з new Date(), ні часова марка, ні часовий пояс не змінюються
Gras Double

3
Це тому, що часові позначки не мають часових поясів. new Date().getTime()завжди буде повертати часову позначку, яка є агностичною для часового поясу. З нею немає жодної часової позначки, поки ви не спробуєте відформатувати її в щось інше, ніж кількість мілісекунд з епохи Unix.
frontendbeauty

7
Наскільки я можу сказати, new Date(new Date().getTime())повертає точно таке ж значення, як і new Date(). Чи можете ви пояснити, у чому сенсі ваша відповідь відрізняє від new Date()?
Кірк Волл

Я публікую це значення на своєму сервері new Date("5/19/2014").getTime(). Конструктор Date створив дату зі зміщенням +7. На сервері (C #) я додаю розміщене значення у мілісекундах до unix epoch new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000). Результат - 5/19/2014 7:00:00 AM. Тож здається, що getTime () дає кількість мілісекунд, включаючи моє зміщення UTC.
xr280xr

1
Є багато коментарів, які скаржаться, що new Date(new Date().getTime())це не працює. Я можу підтвердити, що new Date(Date.UTC(2019, 8, 27, 0, 0, 0))це дійсно створює час UTC. Якщо ви не скористаєтесь Date.UTC(...)датою, ви отримаєте дати у зміщенні UTC у часовому поясі.
Алекс Баркер

15
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

1
Об'єкт дати потрібно фактично встановити на дату. Вище - лише приклад.
Джеймс Скідмор

5
Тепер він повертає "Thu, 04 Jun 2009 04:10:56 GMT", що не є форматом ISO, необхідним в ОП.
nickf

4
Це перетворює його на рядок, який не є датою
Ентоні

2
ні, насправді це повинно бути рядкове подання дати відповідно до ОП.
jcomeau_ictx

3
Після перетворення в UTC він повертається у рядковому форматі, тоді як отримати доступ до таких методів, як getMonth (), getDate () тощо
Sandeep sandy

10

Ще одне рішення для перетворення в UTC та збереження його як об'єкта дати: (Це працює, видаляючи частину 'GMT' з кінця відформатованого рядка, а потім повертаючи його в конструктор дат)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));

Мені потрібно було це зробити для взаємодії з бібліотекою вибору дат. Але в цілому погана ідея таким чином працювати з датами.

Користувачі, як правило, хочуть працювати з датами в їх місцевий час, тому ви або оновите код на стороні сервера, щоб правильно проаналізувати рядки дати та зсувів, потім перетворитесь на UTC (найкращий варіант) або перетворитесь на клієнтську рядок на рівні UTC перед відправкою на сервер (як у відповіді Вілла Стерна)


7

Ви намагаєтесь перетворити дату в такий рядок?

Я би зробив функцію для цього, і, хоча це трохи суперечливо, додати його до прототипу Date. Якщо вам це не зручно, ви можете поставити це як окрему функцію, передаючи дату як параметр.

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;

    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};

Якщо вам це знадобилося в UTC час, просто замініть всі функції get * на getUTC *, наприклад: getUTCFullYear, getUTCMonth, getUTCHours ..., а потім просто додайте "+00: 00" наприкінці замість зрушення часового поясу користувача.


1
Це перший приклад, який я бачив, що намагаються обробити зміщення часового поясу, тому +1 для цього. Однак я знайшов з ним пару речей - temp.substr (-2) викликає помилку, оскільки це число, а не рядок, тому вам потрібно зробити щось на кшталт "temp = '' + temp;" спочатку перетворити його на рядок. Крім того, я віддаю перевагу своїм датам ISO з нульовим навантаженням - думаю, це робить їх більш стандартними.
Мік Сір

@Mick - я оновив, щоб виправити цю помилку. Я використовував String(temp)з тих пір, як інший спосіб ( "" + temp) повідомляється як помилка JSLint в наші дні.
nickf

Зараз це стандартизовано як toISOStringметод
Бергі

7
date = '2012-07-28'; stringdate = new Date(date).toISOString();

повинні працювати в більшості нових браузерів. він повертається 2012-07-28T00:00:00.000Zна Firefox 6.0


7

Моя рекомендація під час роботи з датами полягає в тому, щоб розібрати дату в окремих полях із введення користувача. Ви можете використовувати його як повну струну, але ви граєте з вогнем.

JavaScript може по-різному ставитись до двох рівних дат у різних форматах.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

Ніколи не робіть нічого подібного:

new Date('date as text');

Після того, як ваша дата буде розібрана в окремих її полях із введення користувача, створіть об’єкт дати. Після створення об’єкта дати перетворіть його в UTC, додавши зміщення часового поясу. Я не можу підкреслити, наскільки важливо використовувати зсув від об'єкта дати через DST (це ще одна дискусія, щоб показати, чому).

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

Тепер ви можете передати дату серверу в UTC час. Знову настійно рекомендую не використовувати будь-які рядки дати. Або передайте його на сервер, розбитий до найнижчої деталізації, наприклад, рік, місяць, день, хвилина або як значення, подібне мілісекундам від епохи unix.


FYI getYear видаляється з веб-стандартів developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Ghan

6

Якщо ви багато маєте справу з побаченнями, варто скористатися моментом moment.js ( http://momentjs.com ). Метод перетворення в UTC був би:

moment(yourTime).utc()

Ви можете використовувати формат, щоб змінити дату на будь-який потрібний формат:

moment(yourTime).utc().format("YYYY-MM-DD")

Існує також можливість компенсації моментів, але є додаткова додаткова бібліотека для роботи з часовим поясом ( http://momentjs.com/timezone/ ). Перетворення часу було б таким же простим:

moment.tz(yourUTCTime, "America/New_York")

в чому різниця між moment(yourTime).utc()і moment.utc(yourTime)? Я зазвичай використовую останнє.
ps0604

5

Моє рішення зберігає дату однаковою незалежно від того, який часовий пояс встановлений на стороні клієнта. Можливо, комусь це стане в нагоді.

Мій випадок використання:

Я створюю додаток todo, де ви встановлюєте дату свого завдання. Ця дата повинна залишатися незмінною незалежно від того, в якому часовому поясі ви знаходитесь.

Приклад. Ви хочете зателефонувати своєму другові о 8 годині ранку 25 червня.

Ви створюєте це завдання за 5 днів до (20 червня), перебуваючи в Китаї.

Потім, в той же день, ви летите до Нью-Йорка на кілька днів.

Тоді 25 червня, поки ви все ще знаходитесь у Нью-Йорку, ви прокидаєтесь о 7:30 ранку (це означає, що ви повинні отримати повідомлення про завдання через 30 хвилин (навіть тому, що це 13:30 вже в Китаї, де ви були під час створення завдання)

Тож завдання - це ігнорування часового поясу. Це означає: "Я хочу це зробити о 8 ранку в будь-який часовий пояс, в якому я буду".

Що я роблю, - скажімо, "я припускаю, що ви завжди в лондонському часовому поясі - UTC".

Що це означає - коли користувач вибирає якусь дату у своєму часовому поясі - я перетворюю цю дату на ту саму дату в UTC. тобто. Ви вибираєте 8 ранку в Китаї, але я перетворюю його на 8 ранку в UTC.

Потім - наступного разу, коли ви відкриєте додаток - я прочитаю збережену в UTC дату і перетворять її на ту саму дату у вашому поточному часовому поясі - наприклад. Я перетворюю 8 ранку в UTC та 8 ранку в нью-йоркському часовому поясі.

Це рішення означає, що дата може означати щось інше, залежно від того, де ви знаходитесь, і де читаєте, але вона залишається постійною таким чином, що вона "відчуває", як ви завжди в одному часовому поясі.

Давайте запишемо якийсь код:

По-перше - у нас є дві основні функції для перетворення з / на UTC ігнорування часового поясу:

export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
  const timestamp = Date.UTC(
    date.getFullYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds(),
  );

  return new Date(timestamp);
}

export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
  return new Date(
    utcDate.getUTCFullYear(),
    utcDate.getUTCMonth(),
    utcDate.getUTCDate(),
    utcDate.getUTCHours(),
    utcDate.getUTCMinutes(),
    utcDate.getUTCSeconds(),
    utcDate.getUTCMilliseconds(),
  );
}

Потім я зберігаю / читаю цю дату, наприклад:

function saveTaskDate(localDate: Date) {
  // I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
  const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
  api.saveTaskDate(utcDate);
}

function readTaskDate(taskUtcDate: Date) {
  // I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
  const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);

  // this date will have the same calendar day as the one you've picked previously
  // no matter where you were saving it and where you are now
}

4

Щойно я виявив, що версія 1.2.3 Стівен Левітан date.format.js робить саме те, що я хочу. Це дозволяє надати рядок формату для дати JavaScript і буде конвертувати з місцевого часу в UTC. Ось код, який я зараз використовую:

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);

// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 

9
Це здається не найкращою відповіддю на ваше запитання. Вам слід переглянути щось, що безпосередньо відповідає на ваше запитання або поставити запитання по-іншому.
hitautodestruct

1
Я, здається, виправляє саме цей сценарій (і версію), оскільки він недостатній для IE7 та Firefox.
Barbarrosa

4

Я виявив, що найкраще розібрано дату плагіна jQuery Globalization . Інші методи мали проблеми з веб-браузером, і такі речі, як date.js, не оновлювалися досить довго.

Також вам не потрібен датчик на сторінці. Ви можете просто назвати щось подібне до прикладу, наведеного в документах:

$.parseDate('yy-mm-dd', '2007-01-26');

1
Просто те, що щось не оновлено, не означає, що ви не повинні його використовувати. Date.js працював так чудово роками, тому не потребував оновлення. Об'єкт дати JS та формати дати, що використовуються, не змінювалися протягом останніх кількох років, так чому б сценарій, який ними маніпулює? Date.JS - це абсолютно найкраща бібліотека JS Date там. У Github існує декілька питань, але в іншому випадку це ідеально. github.com/datejs/Datejs
thugsb

3

Ця функція прекрасно працює для мене.

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();
}


2
var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

Це дасть вам належну дату та час UTC.
Це тому, що getTimezoneOffset()воля надасть вам різницю часових поясів у хвилинах. Я рекомендую вам не використовувати, toISOString()оскільки вихід буде в рядку. Отже, надалі ви не зможете маніпулювати датою



2

Якщо вам потрібен об’єкт дати

Передача лише рядка дати Дата передбачає зміщення часу на 00:00 за часовим поясом:

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

Якщо додати поточні години та хвилини, ви отримаєте належну дату:

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)

1

З вашого питання зрозуміло, що ви просто хочете відправити діапазон дат у свій бекенд для подальшої обробки після публікації.

Я припускаю, що ви відповідають стандартним рекомендаціям щодо даних, які передбачають, що дані будуть у певному форматі. Наприклад, я використовую ODATA, яка є API RESTfull, який очікує, що об'єкти часу будуть у форматі: -

РРРР-ММ-DDT00: 00: 00.

Це можна легко досягти за допомогою фрагмента, розміщеного нижче (Будь ласка, змініть формат відповідно до вашої вимоги).

var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";

Якщо, з іншого боку, ви знаходитесь в моїй ситуації, коли ви отримали дату зі свого сервера, і браузер перетворює це на вашу місцеву дату. Ви, з іншого боку, зацікавлені в даті UTC, тоді ви можете виконати наступне:

var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);

Вище фрагмент коду в основному додає / віднімає доданий / віднімається часом браузер на основі часового поясу.

Наприклад, якщо я перебуваю в EST (GMT-5) і моя служба повертає об'єкт часу дати = Ср. Серп. Тож якщо я спробую знайти час, я отримую ср. 16 серпня, 19:00:00 GMT-0500. Це спричиняє масу проблем. Існує багато бібліотек, які, безумовно, полегшать це, але я хотів поділитися принципом чистого JS.

Для отримання додаткової інформації дивіться: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/ де я отримав своє натхнення.

Сподіваюся, це допомагає!


1

Цей метод дасть вам: 2017-08-04T11:15:00.000+04:30і ви можете ігнорувати змінну зони, щоб просто її отримати 2017-08-04T11:15:00.000.

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}

1

Використовуючи пакет часу, ви можете легко перетворити рядок дати UTC у новий об'єкт дати:

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

Це спеціально допомагає, коли ваш сервер не підтримує часовий пояс і ви хочете завжди зберігати дату UTC на сервері та повертати його як новий об'єкт дати. Вищевказаний код працював на мою вимогу аналогічного випуску, для якого використовується ця нитка. Спільний доступ тут, щоб він міг допомогти іншим. Я не бачу точно зазначеного вище рішення в жодній відповіді. Дякую.


4
Незважаючи на те, що це може відповісти на питання, пояснення вашого коду немає. Будь ласка, оновіть свою відповідь, щоб пояснити, що ви робите. Дякую!
Мирослав Гламузіна


0

Я знаю, що це питання давнє, але я шукав це саме питання, і одним із варіантів було б надіслати на сервер date.valueOf (). функція valueOf () дати javascript надсилає кількість мілісекунд з півночі 1 січня 1970 року за UTC.

valueOf ()


0

Отже, це було так, як я повинен був це зробити, тому що я все ще хотів, щоб об'єктом дати JavaScript маніпулювати датою, і, на жаль, багато цих відповідей вимагають від вас перейти до рядка.

//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)

//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that 

var correctDate = new Date(newDate.setUTCHours(0))

//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability 

0

пряжі додають момент

import moment from 'moment';

//local Js date to UTC using moment
const utcDate = moment.utc(moment(new date()).format('YYYY-MM-DDTHH:mm:ss')).valueOf();
console.log('UTC Date', utcDate);


// UTC to local date without moment
const localDate = convertUTCDateToLocalDate(new Date(utcDate))
console.log('UTC Date', moment(localDate).format('MMM D, YYYY HH:mm'));


function convertUTCDateToLocalDate(date) {

   let newDate = new Date(date.getTime() + date.getTimezoneOffset()*60*1000);

   const offset = date.getTimezoneOffset() / 60;
   const hours = date.getHours();

   newDate.setHours(hours - offset);

   return newDate;

}


-8

Ще простіше

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);

2
Це неповно. setTimeпокладається на те new Date, що ви не включаєте. Будь ласка, заповніть відповідь.
random_user_name

ця людина ще жива? чому б навіть не повернутися до нас, щось сказати чи відредагувати відповідь?
Безнадійний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.