См. Этот комментарий: https://github.com/timrwood/moment/issues/272#issuecomment -5095486
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 (); Возвращает местное время. Вот скриншот.
Строка после объекта - это 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. Но, согласно этому обсуждению, это не так, и он просто устанавливает флаг. До сих пор неясно, что делает этот флаг. Ничего из этого не упоминается в документации, что делает ее ужасно неадекватной. Пожалуйста, добавьте пояснение по этой теме с примерами в свой журнал. Спасибо.
Самый полезный комментарий
Я должен добавить к выражению недоумения по поводу функциональности UTC. Самым интуитивным ожиданием от moment.utc () было бы то, что он вернет объект Moment, представляющий текущую дату / время по времени UTC. Но, согласно этому обсуждению, это не так, и он просто устанавливает флаг. До сих пор неясно, что делает этот флаг. Ничего из этого не упоминается в документации, что делает ее ужасно неадекватной. Пожалуйста, добавьте пояснение по этой теме с примерами в свой журнал. Спасибо.