<p>moment.utc (string) анализирует ISO8601 как местное время, когда часовой пояс отсутствует</p>

Созданный на 12 апр. 2012  ·  24Комментарии  ·  Источник: moment/moment

См. Этот комментарий: https://github.com/timrwood/moment/issues/272#issuecomment -5095486

Самый полезный комментарий

Я должен добавить к выражению недоумения по поводу функциональности UTC. Самым интуитивным ожиданием от moment.utc () было бы то, что он вернет объект Moment, представляющий текущую дату / время по времени UTC. Но, согласно этому обсуждению, это не так, и он просто устанавливает флаг. До сих пор неясно, что делает этот флаг. Ничего из этого не упоминается в документации, что делает ее ужасно неадекватной. Пожалуйста, добавьте пояснение по этой теме с примерами в свой журнал. Спасибо.

Все 24 Комментарий

moment.utc (string) анализирует ISO8601 как местное время, когда часовой пояс отсутствует

так говорит ISO8601 ... и EcmaScript 6

Я думаю, что это применимо к moment(string) довольно хорошо, но при использовании moment.utc(string) , я думаю, подразумевается, что вы хотите, чтобы он анализировался как UTC.

moment('2010-10-20T08:40'); // should parse to local time
moment.utc('2010-10-20T08:40'); // should parse to utc time

У меня проблема, я думаю, связанная с этим:

Я пытаюсь преобразовать эту дату: 12-04-2012 (ДД-ММ-ГГГГ, в UTC) в метку времени Unix.
Я делаю это:

var date = '12-04-2012';
var mm = moment().utc( date, "DD-MM-YYYY" );
console.log( mm.valueOf() );

Это выводит неверную метку времени: 1334670827391 .
Если я попробую:

console.log( mm.format('DD-MM-YYYY') );

Итог: 17-04-2012

a538306 исправляет это. Выйдет в 1.6.0

Я все еще вижу эту проблему в последней версии ..

Я прохожу: moment.utc ('2012-12-14T00: 29: 40.276Z') и получаю: {_d: Thu Dec 13 2012 18:29:40 GMT-0600 (Центральное стандартное время), _isUTC: true (13 декабря 2012 г., 18:29:40 GMT-0600 (Центральное стандартное время)) .. Он использует не время UTC, а мой местный часовой пояс.

Вот что я получаю с 1.7.2 .

moment.utc('2012-12-14T00:29:40.276Z').format(); // "2012-12-14T00:29:40+00:00"

Вот что у меня происходит (последняя версия), когда я пишу в консоль в хроме:

console.log (moment.utc ('2012-12-14T00: 29: 40.276Z'));
console.log (moment.utc ('2012-12-14T00: 29: 40.276Z'). format ());
console.log (moment.utc ('2012-12-14T00: 29: 40.276Z'). toDate ());

Ч {_d: 13 декабря 2012 г., 18:29:40 GMT-0600 (Центральное стандартное время), _isUTC: true, _a: Array [8], _lang: false, clone: ​​function…}

2012-12-14T00: 29: 40 + 00: 00

13 декабря 2012 г., 18:29:40 GMT-0600 (центральное стандартное время)

Разве это не должно создавать новую дату в utc (без часового пояса)? Также первый console.log показывает объект момента с часовым поясом cst, а не время utc.

Thu Dec 13 2012 18:29:40 GMT-0600 - это то же самое время, что и 2012-12-14T00:29:40.276Z . Это просто разные способы отображения одного и того же времени. Если хотите, вы можете увидеть это, выполнив следующие действия.

console.log(moment.utc('2012-12-14T00:29:40.276Z').toDate().toString());
// Thu Dec 13 2012 16:29:40 GMT-0800 (PST)
console.log(moment.utc('2012-12-14T00:29:40.276Z').toDate().toUTCString());
// Fri, 14 Dec 2012 00:29:40 GMT

В собственном JS Date нет режима utc и local, у него есть только такие аксессоры, как getUTCHours и getHours .

Moment.js абстрагирует эти методы getUTC* vs get* с идеей режима utc и локального режима. Если момент находится в режиме utc, он использует методы getUTC* . Если он находится в локальном режиме, он использует методы get* .

Спасибо за разъяснения.

Я ожидал и думал, что в стандарте iso указано, что Z означает отсутствие часового пояса, для которого по умолчанию используется utc. Итак, если вы сделали moment.utc ('2012-12-14T00: 29: 40.276Z') или moment ('2012-12-14T00: 29: 40.276Z'), оба будут рассматриваться как utc, а флаг utc будет установлено значение true.

PS, извините, что так беспокою:. Я создаю новое обсуждение для другого вопроса: s

Нет проблем.

Причина, по которой мы не устанавливаем флаг isUTC как для moment() и для moment.utc() заключается в том, что даже если вы анализируете строку UTC + 0, вы можете захотеть отобразить момент в часовом поясе пользователя.

Это довольно распространенный вариант использования, поскольку рекомендуется хранить время в виде строк ISO8601 UTC + 0 на бэкэнде и отображать их во внешнем интерфейсе в часовом поясе пользователя.

Спасибо, я надеюсь, что это обсуждение окажется полезным для кого-то еще.

Когда я запускаю console.log (moment.utc ()), он сообщает: «Пт, 18 января 2013 г., 16:25:32 GMT-0800 (UTC)». Однако это местное тихоокеанское время, а НЕ текущее время в формате UTC. Поскольку он явно говорит (UTC), когда я регистрирую его, я предполагаю, что он думает, что «16:25:32» находится во времени UTC, но это действительно местное тихоокеанское время ...

Кроме того, я предполагаю, что moment.utc (). ValueOf () возвращает количество миллисекунд в UTC с начала эпохи, что кажется неверным. Вы видели подобное поведение?

console.log (момент ())
H {_d: Fri 18 января 2013 16:51:20 GMT-0800 (UTC), _isUTC: false, _a: null, _lang: false}
console.log (момент.utc ())
H {_d: Fri Jan 18 2013 16:51:20 GMT-0800 (UTC), _isUTC: true, _a: null, _lang: false}

Похоже, все, что он делает, это переворачивает флаг _isUTC. : P Кажется, он возвращает местное время независимо от того, указывал ли я .utc () или нет.

Да, .utc и .local просто меняют флаг .isUTC который используется во всех геттерах и сеттерах.

Поскольку собственный Date.toString отображается по местному времени, вы видите одно и то же представление в обоих случаях.

Однако .format использует флаг .isUTC , поэтому форматирование момента с флагом isUTC установленным в true, будет форматироваться должным образом.

См. Различия ниже относительно Date.prototype.toString , Date.prototype.toUTCString и moment.fn.format .

moment().toDate().toString();     // "Wed Jan 23 2013 09:48:54 GMT-0800 (PST)"
moment.utc().toDate().toString(); // "Wed Jan 23 2013 09:48:54 GMT-0800 (PST)"
moment().toDate().toUTCString();     // "Wed, 23 Jan 2013 17:48:54 GMT"
moment.utc().toDate().toUTCString(); // "Wed, 23 Jan 2013 17:48:54 GMT"
moment().format();     // "2013-01-23T09:48:54-08:00"
moment.utc().format(); // "2013-01-23T17:48:54+00:00"

Такая же проблема здесь:
момент (). valueOf () и момент (). utc (). valueOf ()
вернуть то же значение! :расстроен:

Итак, чтобы получить миллисекунды utc, мне нужно:

moment().valueOf() - (moment().utcOffset() * 60 * 1000)

@rubenspgcavalcante - я не понимаю, о чем вы спрашиваете. Эти два _предполагается_, чтобы возвращать одно и то же значение, оба из которых находятся в миллисекундах с эпохи unix.

Написанный вами фрагмент фактически возвращает другой момент времени.

У меня аналогичная проблема, когда для флага UTC установлено значение true, но когда я вызываю format (); Возвращает местное время. Вот скриншот.

screen shot 2016-07-10 at 8 50 15 am

Строка после объекта - это console.log переменной после вызова format (); в теме.

Я делаю что-то неправильно?

@ james-hoegerl похоже, что внутренний объект даты - 5 июля 2016 года в 19:00 по центральному времени. Добавьте к этому пять часов, чтобы добраться до всемирного координированного времени, и это 6 июля, которое, похоже, регистрируется, так что, короче говоря, я не вижу ничего плохого.
Похоже, вы используете fullcalendar. Он выполняет некоторые исправления расширения / обезьяны, которые могут вызвать необычное поведение.

Хорошо, может я просто запуталась насчет uct. Я думал, что получу «2016-05-07 07:00:00», тогда я смогу сохранить это в БД, а затем получить местное время для каждого компьютера конечного пользователя через момент.

Итак, прежде всего я предполагаю, что вы имели в виду 6016-07-05 (5 июля, а не 7 мая). Ваше местное время - 5 июля в 19:00. С поправкой на дневной свет в центральных регионах США мы добавляем пять часов. Получается 6 июля в полночь.

Если вы хотите получить 5 июля, то, думаю, вам действительно нужно местное время, а не UTC. Вы можете вызвать .local () в тот момент, чтобы вернуть его к местному времени.

Вы можете найти это полезным: https://maggiepint.com/2016/05/14/moment-js-shows-the-wrong-date/

Большое спасибо за помощь @maggiepint. Да, мой предыдущий комментарий имел в виду 7-5. Извините за то, что я поспешно написал этот комментарий на свой телефон у бассейна в эти выходные. Теперь я вижу, что мое мышление было обратным. fullcalendar работает со всеми неоднозначными объектами моментов времени, так что я думаю, что у меня было какое-то недоразумение, и мне нужно кое-что исправить. Еще раз спасибо за ваше время

Привет, чтобы преобразовать UTC в пользовательское время, нам нужно предоставить формат.
например: let utcTime = moment ({час: 10, минута: 20) .format ('ГГГГ-ММ-ДД ЧЧ: мм: сс');
пусть stillUtc = moment.utc (utcTime) .toDate ();
пусть localTime = moment (stillUtc) .local ();
Теперь я могу получить localTIme. Но если я удалю формат, я все еще могу формат UTC. здесь 10:20 - это часовой пояс UTC, который исходит из бэкэнда. Я хочу показать это пользователю в часовом поясе пользователя.

Пожалуйста, помогите мне.

Такая же проблема здесь:
момент (). valueOf () и момент (). utc (). valueOf ()
вернуть то же значение! 😞
Итак, чтобы получить миллисекунды utc, мне нужно:
момент (). valueOf () - (момент (). utcOffset () * 60 * 1000)

@rubenspgcavalcante - я не понимаю, о чем вы спрашиваете. Предполагается, что эти двое должны возвращать одно и то же значение, оба из которых находятся в миллисекундах с эпохи unix.

@ mj1856 Я не понимаю, как moment (). valueOf () и moment (). utc (). valueOf () должны возвращать одно и то же значение ??

Я должен добавить к выражению недоумения по поводу функциональности UTC. Самым интуитивным ожиданием от moment.utc () было бы то, что он вернет объект Moment, представляющий текущую дату / время по времени UTC. Но, согласно этому обсуждению, это не так, и он просто устанавливает флаг. До сих пор неясно, что делает этот флаг. Ничего из этого не упоминается в документации, что делает ее ужасно неадекватной. Пожалуйста, добавьте пояснение по этой теме с примерами в свой журнал. Спасибо.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги