Объект даты действителен в Chrome, но не в Safari, Firefox или IE.

Я получаю объект даты из API. Вот формат, возвращаемый API:

"2016-04-05 13:39:46.612"

Chrome, кажется, интерпретирует это и отображает правильно, но в Firefox, Safari и IE я получаю либо нулевую, либо неверную дату.

Результаты Chrome:

console.log(purchaseDate) 
>> Tue Apr 05 2016 13:39:46 GMT-0500 (CDT)

Этот HTML-код в представлении Angular: {{$scope.purchaseDate | дата: 'МММ д, г ч: мм а'}} выходы: 5 апреля 2016 г. 13:39

Результаты Firefox (аналогично для Safari и IE):

console.log(purchaseDate) 
>> Invalid Date

Этот HTML-код в представлении Angular: {{$scope.purchaseDate | date:'MMM d, y h:mm a'}} выходы: null

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

Результаты Chrome:

console.log(moment(purchaseDate).format()) 
>> 2016-04-05T13:39:46-05:00

Результаты Firefox (аналогично для Safari и IE):

console.log(moment(purchaseDate).format()) 
>> Invalid Date

Любые идеи? Я хотел бы использовать moment.js, чтобы обеспечить согласованность синтаксического анализа, поскольку я уже использую его в другом месте своего кода.


person Paul Erdos    schedule 06.04.2016    source источник
comment
Вы должны передать формат в moment.js при первом вызове, иначе он просто угадывает при разборе строки.   -  person RobG    schedule 06.04.2016
comment
Если это действительно формат, поступающий в виде строки непосредственно из API, вернитесь к API и измените его на что-то разумное, например ISO-8601. Однако я предполагаю, что вы уже преобразовали результат API в объект Date и на самом деле видите неявное преобразование Date в string. Вы уверены, что это именно та строка, которая выходит из API? Посмотрите на необработанный HTTP.   -  person Matt Johnson-Pint    schedule 06.04.2016
comment
Можете ли вы повлиять на то, что возвращает ваш API? Если да, лучшим решением будет НЕ возвращать данные в этом формате, это довольно безумно.   -  person shabunc    schedule 06.04.2016
comment
Можете ли вы показать код, где вы установили purchaseDate?   -  person BrunoLM    schedule 06.04.2016
comment
Хороший звонок, @MattJohnson, необработанный ответ на самом деле 2016-04-05 13:39:46.612. Я обновил вопрос.   -  person Paul Erdos    schedule 06.04.2016


Ответы (2)


Если вы собираетесь использовать момент с angular, вам также следует использовать angular-moment.

При загрузке значения создайте объект moment вместо объекта Date.

var purchaseDate = moment("2016-04-05 13:39:46.612");

Этот конкретный формат уже распознан moment.js, поэтому вам не нужно указывать строку формата при синтаксическом анализе. Однако имейте в виду, что оно будет интерпретироваться как местное время. Если вы хотите, чтобы это было в формате UTC, то:

var purchaseDate = moment.utc("2016-04-05 13:39:46.612");

В любом случае вы можете использовать угловой момент для его форматирования:

{{$scope.purchaseDate | amDateFormat:'MMM D, Y h:mm a'}} 

Angular-moment также предоставляет множество других фильтров, которые вы можете использовать, если хотите. ознакомьтесь с их документами.

person Matt Johnson-Pint    schedule 06.04.2016
comment
Я считаю, что угловой момент преобразует строки в моменты для вас. Нет необходимости в предварительной обработке. Хотя давно им не пользовался, так что не цитируйте меня. - person Maggie Pint; 06.04.2016
comment
@MaggiePint - Хороший вопрос. Он может анализировать строку напрямую. Я думаю, что это будет работать и с объектом момента или объектом даты, но некоторое время не проверял. - person Matt Johnson-Pint; 06.04.2016
comment
Читая исходный код, похоже, что в этом случае он просто переходит непосредственно к конструктору момента. Таким образом, строка, момент, дата, целое число в миллисекундах и уродливая строка даты ASP.NET должны работать. Однако вам нужно сделать что-то еще, если у вас есть целое число в секундах. - person Maggie Pint; 06.04.2016

Я думаю, что у меня была похожая проблема, и для меня лучшим решением было использовать библиотеку momentjs для анализа строки даты:

bower install --save moment

а потом например:

 $scope.purchaseDate  = moment("2016-04-05 13:39:46.612", "YYYY-MM-DD HH:mm:ss.SSS").toDate();

см. формат синтаксического анализа здесь: http://momentjs.com/docs/#/parsing/string-format/

на HTML-странице, например:

{{purchaseDate | date:'medium'}}

учтите, что momentjs позаботится о вашем местном часовом поясе и соответственно изменит дату

Я надеюсь, что это помогает.

person thegio    schedule 06.04.2016
comment
Я попробовал именно это и все еще получаю нулевую/недействительную дату в браузерах, отличных от Chrome. - person Paul Erdos; 06.04.2016
comment
Я понял вашу точку зрения, попробуйте: $scope.purchaseDate = moment(2016-04-05 13:39:46.612, YYYY-MM-DD HH:mm:ss.SSS).toDate(); - person thegio; 06.04.2016