Здравствуйте, я наткнулся на сайт 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
Хм, похоже, аббревиатура часового пояса не работает. Извините за удаленную отладку, но каков результат в 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');
Это нормально, но имейте в виду, что:
Europe/Paris
и Europe/Berlin
используют CET
и CEST
.Мы могли бы также рассмотреть возможность адаптации 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"
Самый полезный комментарий
Глупый вопрос: зачем вообще библиотека? Разве цель Moment не в том, чтобы удовлетворить все потребности человека в обработке даты и времени? В то время как файлы данных добавляют нетривиальное количество места (и я могу понять их разделение), сама новая библиотека имеет размер <2 КБ, поэтому пространство, похоже, не является причиной для ее разделения.
Просто грустно, что тот, кто просто хочет сгенерировать строку даты с часовым поясом, должен загрузить две отдельные библиотеки и файл данных, чтобы сделать то, что Javascript должен быть встроен.
Кроме того, как мне использовать это новое объединение библиотек для создания простой строки даты? Раньше я мог создать:
с участием:
Но теперь я не понимаю, как я должен это делать без опции форматирования "z". Любая помощь будет оценена.