Подтвердить что ты не робот

Любой способ проанализировать строку времени с помощью Moment.js, но игнорировать информацию о часовом поясе?

Учитывая объем вопросов часового пояса, я бы подумал, что смогу найти ответ на этот вопрос, но не добился успеха.

Есть ли способ использовать moment.js для синтаксического анализа строки ISO-8601, но он анализируется в моем локальном timzeone? По сути, я хочу игнорировать информацию о часовом поясе, которая предоставляется в строке ISO.

Например, если я нахожусь в часовом поясе EDT:

var x = moment( "2012-12-31T00:00:00+0000" );

даст мне:    "2012-12-30T19: 00: 00-5000"

Я хочу игнорировать информацию о часовом поясе и просто дать мне мгновенный эквивалент "2012-12-31T00: 00: 00-5000" по местному времени (EDT).

4b9b3361

Ответ 1

Я не думаю, что вы действительно хотите игнорировать смещение. Это, в конечном счете, просто заменит смещение, которое вы предоставили одному из своего локального часового пояса, и это приведет к совершенно другому моменту времени.

Возможно, вы просто ищете способ сохранить момент, который он дал? Если это так, используйте функцию moment.parseZone. Например:

var m = moment.parseZone("2012-12-31T00:00:00+0000");
var s = m.format();   // "2012-12-31T00:00:00+00:00"

Вы также можете достичь этого с помощью moment.utc. Разница в том, что moment.parseZone сохранит любое смещение, которое вы ему дадите, а moment.utc будет настроено на UTC, если вы дадите ему ненулевое смещение.

Ответ 2

Я решил это, предоставив формат в качестве второго аргумента и используя метод Moment экранирование символов и завернутые квадратные скобки вокруг часового пояса.

moment("2016-01-01T05:00:00-05:00", "YYYY-MM-DDTHH:mm:ss[Z]").startOf("hour").format()

Это все равно создаст моментальные объекты с использованием локального часового пояса, но не будет делать никакого вычисления автоматического часового пояса. Таким образом, приведенный выше пример даст вам 5 часов, независимо от предоставленного времени.

Ответ 3

Если вы точно знаете, что ваша строка ввода находится в формате ISO-8601, вы можете просто удалить последние 5 цифр и использовать ее в конструкторе Moment.

var input = "2012-12-31T00:00:00+0000"
input = input.substring(0, input.length-5)
moment(input).toString()
> "Mon Dec 31 2012 00:00:00 GMT-0600"

Ответ 4

Я знаю, что опаздываю на вечеринку, у меня был тот же вопрос, и мои поиски не приближали меня ближе. Я сломался и прочитал документацию, и в данный момент есть опция для String + Format:

String + Format docs

moment (String, String);

moment (String, String, String);

moment (String, String, Boolean);

moment (String, String, String, Boolean);

и более слов, то это:

Если вы не укажете смещение часового пояса, разбор строки приведет к созданию даты в текущем часовом поясе.

moment("2010-10-20 4:30",       "YYYY-MM-DD HH:mm");   // parsed as 4:30 local time
moment("2010-10-20 4:30 +0000", "YYYY-MM-DD HH:mm Z"); // parsed as 4:30 UTC

Часть, которая дала мне паузу, была примером, который использовался для синтаксического анализа локального времени, опускавшего +0000, что заставило меня думать, что входная строка должна быть удалена, но это не так.

Пример:

var time = "2012-12-31T00:00:00+0000";
var x = moment(time); // Sun Dec 30 2012 19:00:00 GMT-0500
var y = moment(time,'YYYY-MM-DD'); //Mon Dec 31 2012 00:00:00 GMT-0500

Ответ 5

Есть веские причины делать то, что просит ОП. Самый простой способ сделать это с помощью Moment - использовать его метод parseZone(date). Нет фьюзинга со строковыми манипуляциями или несколькими вызовами. Он эффективно анализирует строку даты, как если бы она была в локальном часовом поясе браузера.

Ответ 6

Лучше всего использовать:

dt = moment("Wed Sep 16 2015 18:31:00 GMT-0400", "ddd MMM DD YYYY HH:mm:ss GMT-0400",true);

И снова отобразить преобразование в желаемый часовой пояс:

 dt.utcOffset("-04:00").toString()
 output > Wed Sep 16 2015 18:31:00 GMT-0400

Ответ 7

Это сложная задача с MomentJS, она будет в основном зависеть и от вашего текущего часового пояса.

Документация также неясна для этой конкретной задачи, так как я решил проблему на моей стороне, добавляя часы к дате перед преобразованием ее в формат JSON.

var dt = moment("Sun Sep 13 2015 00:00:00 GMT-0400", "ddd MMM DD YYYY HH:mm:ss GMT-0400", false);
var date = dt.add(2, 'hour').toJSON();
console.log(date); //2015-09-13T00:00:00.000Z

Ответ 8

Логика Momentjs по умолчанию будет форматировать заданное время с локальным часовым поясом. Чтобы отформатировать исходную дату, я написал функцию:

https://github.com/moment/moment/issues/2788#issuecomment-321950638