Moment: Невозможно найти аббревиатуру часового пояса из Date.prototype.toString ()

Созданный на 6 февр. 2012  ·  33Комментарии  ·  Источник: moment/moment

Здравствуйте, я наткнулся на сайт moment.js через форум и щелкнул по нему, когда наткнулся на модульный тест, который не прошел 2 теста, о чем я хочу сообщить здесь:

UserAgent:
Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 535.7 (KHTML, как Gecko) Chrome / 16.0.912.77 Safari / 535.7 (Chrome 16.0.912.77 m)

Часовой пояс:
UTC + 1

Неудачные тесты (# 28):
http://pastebin.com/bQsDuxdH

* Заголовок отредактировал Timrwood

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

Глупый вопрос: зачем вообще библиотека? Разве цель Moment не в том, чтобы удовлетворить все потребности человека в обработке даты и времени? В то время как файлы данных добавляют нетривиальное количество места (и я могу понять их разделение), сама новая библиотека имеет размер <2 КБ, поэтому пространство, похоже, не является причиной для ее разделения.

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

Кроме того, как мне использовать это новое объединение библиотек для создания простой строки даты? Раньше я мог создать:

Sun, 06 Nov 1994 08:49:37 GMT

с участием:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

Но теперь я не понимаю, как я должен это делать без опции форматирования "z". Любая помощь будет оценена.

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

Хм, похоже, аббревиатура часового пояса не работает. Извините за удаленную отладку, но каков результат в chrome?

new Date().toString()

Кроме того, как называется часовой пояс, в котором вы находитесь?

Я получаю ту же ошибку в модульных тестах, и я тоже нахожусь в UTC + 1 (ранее известном как GMT + 1).

new Date (). toString () печатает «Sat Feb 11 2012 02:15:10 GMT + 0100» в Firefox 10, «Sat Feb 11 2012 02:18:29 GMT + 0100 (Западное европейское стандартное время)» в Chrome 16 и «Сб, 11 февраля, 02:18:59 UTC + 0100 2012» в Internet Explorer 9

Хм, я этого боялся. Проблема в том, что Date.prototype.toString возвращает такие разные результаты. Это единственное место, где можно получить название часового пояса (PST, CST, EST и т. Д.). Если этот метод не возвращает информацию о часовом поясе (как в случае с FF10 и IE9, получить ее невозможно.

Может, пора подешеветь? Или допустимо просто указать проблему в документации?

4318 - сдано, 2 - нет. 2715 миллисекунд.

Mozilla / 5.0 (Windows NT 6.1) AppleWebKit / 535.11 (KHTML, например Gecko) Chrome / 17.0.963.56 Safari / 535.11

UTC +2 (Киев, Украина)

формат часового пояса 2 пройден, 2 не пройден.
---> Что-то вроде "PST"
AssertionError: ---> Что-то вроде "PST"
на Object.ok (http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
на http://momentjs.com/js/tests.js?_=120203_183019:2413:14
в Object.runTest (http://momentjs.com/js/tests.js?_=120203_183019:1702:9)
на http://momentjs.com/js/tests.js?_=120203_183019:1748:25
на http://momentjs.com/js/tests.js?_=120203_183019:1006:13
на http://momentjs.com/js/tests.js?_=120203_183019:616:13
на http://momentjs.com/js/tests.js?_=120203_183019:627:25
на http://momentjs.com/js/tests.js?_=120203_183019:1008:17
на http://momentjs.com/js/tests.js?_=120203_183019:1589:17
---> Что-то вроде "PST"
AssertionError: ---> Что-то вроде "PST"
на Object.ok (http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
на http://momentjs.com/js/tests.js?_=120203_183019:2414:14
в Object.runTest (http://momentjs.com/js/tests.js?_=120203_183019:1702:9)
на http://momentjs.com/js/tests.js?_=120203_183019:1748:25
на http://momentjs.com/js/tests.js?_=120203_183019:1006:13
на http://momentjs.com/js/tests.js?_=120203_183019:616:13
на http://momentjs.com/js/tests.js?_=120203_183019:627:25
на http://momentjs.com/js/tests.js?_=120203_183019:1008:17
на http://momentjs.com/js/tests.js?_=120203_183019:1589:17
+02: 00 ---> Что-то вроде "+07: 30"
+0200 ---> Что-то вроде "+0700"

Я также получаю тот же самый неудачный тест №28. Мой часовой пояс GMT -3.

Агент:
Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 535.11 (KHTML, например Gecko) Chrome / 17.0.963.66 Safari / 535.11

Неудачный тест: http://pastebin.com/dsWHMF3h

.:.

Агент:
Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 10.0.2) Gecko / 20100101 Firefox / 10.0.2
или же
Mozilla / 5.0 (совместимый; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4. 0C; Zune 4.7; .NET4.0E)

Неудачный тест: http://pastebin.com/6t6JP9fu

Похоже, это происходит в UTC + 1, UTC + 2 и UTC-3.

К сожалению, теперь есть способ исправить это. Это зависит от взлома вывода Date().toString() , и если в этой строке нет информации о часовом поясе, нет никакого способа получить эту информацию.

Я собираюсь отказаться от этой функции и, возможно, сделать плагин, который будет давать более надежные (хотя, возможно, менее точные) результаты. Вероятно, это должно быть что-то вроде https://github.com/mde/timezone-js.

Токены z zz устарели с версии 1.6.0. В итоге закрываю этот вопрос.

А как насчет node.js? Является ли z zz надежным или нет в этой среде?

Они официально устарели, поэтому не будут работать с версией 1.6.0.

Для версий кода до этого, я полагаю, результаты также будут несовместимы, поскольку Node использует V8, а некоторые из приведенных выше несовместимых результатов находятся в Chrome, который также использует V8.

Благодарю. Итак, для строки типа Thu Jan 10 2013 22:54:11 GMT+0100 (CET) я в итоге удалил с помощью регулярного выражения строку часового пояса (здесь (CET) с начальным пробелом) и оставил только информацию о временном сдвиге (здесь +0100 ). Считаете ли вы, что для moment.js этого достаточно, или я рискую несогласованностью?

Хм, я не уверен, что вы пытаетесь сделать, вы пытаетесь получить CET или +0100 ?

+0100 поддерживается через токен ZZ (обратите внимание на заглавные буквы) и отлично работает при синтаксическом анализе и форматировании.

CET устарел, поскольку мы не могли надежно получить его из Date.toString . Однако, поскольку мы используем Date.getTimezoneOffset для +0100 , поддержка оказывается гораздо более последовательной.

Я делаю, как вы говорите, использую ZZ для +0100 и удаляю CET из строки для синтаксического анализа. Имеет ли это смысл ?

Приношу свои извинения, я до сих пор не понимаю, в чем проблема. Вы пытаетесь разобрать Thu Jan 10 2013 22:54:11 GMT+0100 (CET) ? Вы должны уметь делать следующее.

moment('Thu Jan 10 2013 22:54:11 GMT+0100 (CET)', 'ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');

Именно этим я и занимаюсь в конце. Похоже, вы подтверждаете, что я поступаю правильно. Мои извинения Если я не понял, спасибо за ответы!

Нет проблем!

@ hughanderson4 , проблема заключалась в том, что браузеры не всегда возвращают сокращение часового пояса из Date.prototype.toString . Поскольку мы не могли достоверно получить аббревиатуру часового пояса, она устарела.

С тех пор был создан момент-часовой пояс , чтобы добавить поддержку часовых поясов для moment.js. Вы можете изучить это, чтобы увидеть, соответствует ли он вашим потребностям.

Как преобразовать moment.utc () в местное время и отобразить аббревиатуру часового пояса?

Глупый вопрос: зачем вообще библиотека? Разве цель Moment не в том, чтобы удовлетворить все потребности человека в обработке даты и времени? В то время как файлы данных добавляют нетривиальное количество места (и я могу понять их разделение), сама новая библиотека имеет размер <2 КБ, поэтому пространство, похоже, не является причиной для ее разделения.

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

Кроме того, как мне использовать это новое объединение библиотек для создания простой строки даты? Раньше я мог создать:

Sun, 06 Nov 1994 08:49:37 GMT

с участием:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

Но теперь я не понимаю, как я должен это делать без опции форматирования "z". Любая помощь будет оценена.

Итак, я спрашиваю, просто чтобы убедиться, что я понимаю: нет замены устаревшему формату 'z'?

Если у меня есть отметка времени в формате ISO-8601, например:

2014-07-25T18:00:00-04:00

И я хочу отобразить эту временную метку следующим образом:

6:00 PM EST

Момент больше не поддерживает это форматирование? Все данные о часовом поясе включены в мою временную метку, и я хочу только отображать их напрямую, без какого-либо преобразования часового пояса.

Это на самом деле не включает часовой пояс. Может быть несколько названий часовых поясов, которые соответствуют одному и тому же смещению UTC, особенно с учетом возможности изменения летнего времени. Вы не можете сделать вывод из «UTC-4: 00», что часовой пояс EST.

Для пояснения: форматировщик z прежнему работает при использовании моментального часового пояса с определенной зоной, поскольку аббревиатуру можно извлечь из данных часового пояса.

Просто упомяните это сейчас - если вы используете
new Date().toTimeString()
насколько я пытался, вы получаете одинаковый результат во всех браузерах.

Это означает, что вы могли бы использовать эту строку для извлечения часового пояса, не так ли?

Привет, я вижу выше, что формат ('z') устарел. также в документации момента, я вижу, что он устарел с 1.6.0. Сейчас я использую 2.11.0, я могу использовать «z» для отображения часового пояса (PST / PDT) в зависимости от смещения.
Не следует ли мне сейчас использовать эту букву z в моем коде? подскажите, пожалуйста, точную альтернативу отображению PST вместо - / + 8

@themakshter - нет, вы не получите одинаковый результат во всех браузерах. ОС, версия браузера и язык сильно влияют на это, и в спецификации нет требования согласованности.

@ Shobana16 - Если вы просто выполните moment().format('z') , он всегда вернет "" .

Если вы используете часовой пояс и сделаете что-то вроде moment.tz('America/Los_Angeles').format('z') , вы получите правильный ответ.

z отлично работает с часовым поясом момента. Он ничего не делает в простой момент.

Спасибо за комментарии MJ. Да, я использую букву z только с часовым поясом. Хорошо, круто, мой код останется с буквой z. !

Просто примечание, которое нужно добавить, с моментом-часовым поясом 0.5.0 вы можете _guess_ в местном часовом поясе, что открывает двери для:

var abbreviation = moment.tz(moment.tz.guess()).format('z');

Это нормально, но имейте в виду, что:

  1. Это просто предположение. Это могло ошибиться.
  2. Если он угадает неверно, все равно существует вероятность того, что аббревиатура может быть правильной, поскольку во многих аналогичных часовых поясах используются одни и те же сокращения, например, как Europe/Paris и Europe/Berlin используют CET и CEST .
  3. Однако никаких гарантий нет. Если он угадает неправильно, вы можете указать неправильное сокращение.

Мы могли бы также рассмотреть возможность адаптации moment.js таким образом, чтобы, если доступен момент-часовой пояс, он мог попытаться сделать это автоматически, чтобы повторно включить средство форматирования z . Хотя в настоящее время этого не происходит.

var abbreviation = moment.tz(moment.tz.guess()).format('zz'); , похоже, не работает (с двумя z s). Могу ли я получить только «EDT», а не «восточное летнее время»?

Благодаря!

Аххх, я обнаружил, что http://momentjs.com/timezone/docs/#/using -timezones / formatting / говорит: Чтобы предоставить длинные имена форм, вы можете переопределить moment.fn.zoneName и использовать zz токен
[and much more...]
Благодарю.

Но вот что сбивает с толку. В текущей версии (или, как заявлено, « начиная с moment(...).toString() GMT в конце отображается, например,

Но вот что сбивает с толку. В текущей версии (или, как заявлено, « начиная с moment(...).toString() GMT в конце отображается, например,

Думаю, проблема в надежности. Moment не может надежно извлечь правильный часовой пояс из локального объекта даты, поэтому он больше не поддерживает z/zz в своем форматировании.

Обсуждалось выше:
https://github.com/moment/moment/issues/162#issuecomment -4060027

Это то, что помогло нам получить текст "GMT", поскольку z устарело

const dateGenerated = moment("2020-05-20 08:15:25");
const localDateGenerated = dateGenerated.local().format('DD MMM YYYY hh:mm A') + ' ' + String(dateGenerated.local()._d).split(' ')[5];

Это сгенерирует 20 May 2020 08:15 AM GMT+0300"

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