Форматирование даты с помощью Moment.js

У меня есть строка в таком формате:

var testDate = "Fri Apr 12 2013 19:08:55 GMT-0500 (CDT)"

Я хотел бы использовать Moment.js, чтобы получить его в этом формате mm/dd/yyyy : 04/12/2013 для отображения.

Я пробовал сделать это с помощью этого метода,

moment(testDate,'mm/dd/yyyy');

Какие ошибки и говорит there is no such method called replace? Я неправильно подхожу к этому?


Редактировать

Я также должен упомянуть, что я использую предварительно упакованную версию Moment.js, упакованную для Meteor.js

Object [object Date] has no method 'replace' : The Exact error from the console

Трассировки стека:

 at makeDateFromStringAndFormat (http://127.0.0.1:3000/packages/moment/lib/moment/moment.js?b4e3ac4a3d0794023a4410e7941c3e179398b5b0:539:29)
    at moment (http://127.0.0.1:3000/packages/moment/lib/moment/moment.js?b4e3ac4a3d0794023a4410e7941c3e179398b5b0:652:24)
    at populateProfileForEdit (http://127.0.0.1:3000/client/views/home/administration/directory/profiles/profiles.js?acfff908a6a099f37312f62892a22b40f82e5e0f:147:25)
    at Object.Template.profile_personal.rendered (http://127.0.0.1:3000/client/views/home/administration/directory/profiles/profiles.js?acfff908a6a099f37312f62892a22b40f82e5e0f:130:13)
    at Spark.createLandmark.rendered (http://127.0.0.1:3000/packages/templating/deftemplate.js?b622653d121262e50a80be772bf5b1e55ab33881:126:42)
    at http://127.0.0.1:3000/packages/spark/spark.js?45c746f38023ceb80745f4b4280457e15f058bbc:384:32
    at Array.forEach (native)
    at Function._.each._.forEach (http://127.0.0.1:3000/packages/underscore/underscore.js?867d3653d53e9c7a171483edbcad9670e12288c7:79:11)
    at http://127.0.0.1:3000/packages/spark/spark.js?45c746f38023ceb80745f4b4280457e15f058bbc:382:7
    at _.extend.flush (http://127.0.0.1:3000/packages/deps/deps.js?9642a93ae1f8ffa8eb1c2475b198c764f183d693:231:11) 

person Warz    schedule 13.04.2013    source источник
comment
Вы используете replace() в своем коде? В противном случае плагин, который вы используете, неправильно вызывает несуществующий метод.   -  person cereallarceny    schedule 14.04.2013
comment
Я обновил свой вопрос, указав точную ошибку и трассировку стека с помощью метода, вызывающего замену. Я вообще не вызываю замену напрямую   -  person Warz    schedule 14.04.2013


Ответы (7)


Второй аргумент moment() - это формат синтаксического анализа, а не формат отображения.

Для этого вам нужен .format() метод:

moment(testDate).format('MM/DD/YYYY');

Также обратите внимание, что регистр имеет значение. Для месяца, дня месяца и года формат должен быть прописным.

person Jonathan Lonowski    schedule 13.04.2013
comment
Превосходно. Изначально я пытался использовать это как this moment (). Format (), но это не удалось. Спасибо - person Warz; 14.04.2013
comment
var obj = {end_date: moment ($ scope.activity.endDate) .format ('ММ / ДД / ГГГГ')}; - person Michael J. Calkins; 08.08.2013
comment
@MichaelCalkins Извини. Для чего это? И почему дополнительная ссылка на AngularJS ($scope)? - person Jonathan Lonowski; 08.08.2013
comment
@JonathanLonowski Это может быть любая переменная. Я программировал и искал ответ. Просто пример. - person Michael J. Calkins; 08.08.2013
comment
Всякий раз, когда я использую формат, я не могу вызвать для него date (). Поэтому мне пришлось использовать какую-то конструкцию подстроки, чтобы извлечь день из формата (ДД-ММ-ГГГГ). - person Henk Jansen; 04.10.2013
comment
Теперь он получает предупреждение об устаревании. К вашему сведению: github.com/moment/moment/issues/1407 - person JohnSnow; 15.03.2017
comment
@JohnSnow вы можете использовать LLLL в качестве второго аргумента в момент, который сообщает текущий формат даты. ex - момент (testDate, LLLL) .format ('MM / DD / YYYY'); - person Vikas Chauhan; 02.05.2019
comment
Сделайте еще один шаг ... String.prototype.formatDate = function (format = M / DD / YYYY) {return moment (this) .format (format); }; - person dave4jr; 23.08.2019
comment
В моем случае работает: const initialDate = moment (this.initialDate) .format ('YYYY-MM-DDTHH: mm: ssZ'); - person Philip Developer; 06.10.2020

Включите момент.js и, используя приведенный ниже код, вы можете отформатировать дату

var formatDate= 1399919400000;

var responseDate = moment(formatDate).format('DD/MM/YYYY');

Мой вывод: «13.05.2014».

person Akalya    schedule 13.05.2014
comment
Как я могу это изменить? Я имею в виду, если у меня есть более поздний формат и я хочу изменить его на первый. - person Arslan Tariq; 09.10.2017
comment
@ArslanTariq вы можете использовать momentObject.valueOf(), чтобы получить миллисекунды от эпохи. - person WesternGun; 21.12.2017

Вероятно, вам больше не нужен Moment.js

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

date-fns - одна из лучших облегченных библиотек, она модульная, поэтому вы можете выбирать нужные функции и сокращать размер пакета (проблема & оператор).

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

import { format } from 'date-fns' // 21K (gzipped: 5.8K)
import moment from 'moment' // 292.3K (gzipped: 71.6K)

Отформатируйте дату с помощью date-fns:

// moment.js
moment().format('MM/DD/YYYY');
// => "12/18/2020"

// date-fns
import { format } from 'date-fns'
format(new Date(), 'MM/dd/yyyy');
// => "12/18/2020"

Подробнее в шпаргалке со списком функций, которые можно использовать для замены moment.js: You-Dont-Need-Momentjs

person t_dom93    schedule 18.12.2020

Для исходной даты вывода используйте format. Второй аргумент предназначен для синтаксического анализа - однако, если вы его опустите, вы testDate вызовете предупреждение об устаревании.

Предупреждение об устаревании: указанное значение не в распознанном формате RFC2822 или ISO ...

var testDate= "Fri Apr 12 2013 19:08:55 GMT-0500 (CDT)"

let s= moment(testDate).format('MM/DD/YYYY');

msg.innerText= s;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

<div id="msg"></div>

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

var testDate= "Fri Apr 12 2013 19:08:55 GMT-0500 (CDT)"

let s= moment(testDate, 'ddd MMM D YYYY HH:mm:ss ZZ').format('MM/DD/YYYY');

console.log(s);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

person Kamil Kiełczewski    schedule 15.04.2019
comment
Отлично, сначала я должен предоставить идентификатор (формат) нашего формата даты, а затем желаемый формат. хороший пример. - person Sudhir K Gupta; 09.05.2019

Может быть, это поможет кому-то, кто хочет или неожиданно искать несколько форматов даты один за другим. Найдите код: я использую функцию формата moment.js для текущей даты как (сегодня 29.06.2020) var startDate = moment (new Date ()). Format ('MM / DD / YY'); Результат: 28.06.20

что происходит, он сохраняет только часть года: 20 как 28.06.20, после того, как я запустил оператор: новая дата (startDate) Результат: понедельник, 28 июня 1920 г., 00:00:00 GMT + 0530 (стандартное время Индии) ,

Затем, когда я использую другой формат 28.06.20: startDate = moment (startDate) .format ('MM-DD-YYYY'); Результат: 28.06-1920, в браузерах google chrome и firefox он дает правильную дату при второй попытке: 06-28-2020. Но в IE возникают проблемы, из этого я понял, что мы можем применить один формат даты к данной дате. Если нам нужен второй формат даты, он должен применяться к новой дате, а не к результату первого формата даты. Также обратите внимание, что при первом применении «ММ-ДД-ГГГГ», а затем «ММ-ДД-ГГ» работает в IE. Для ясного понимания, пожалуйста, найдите мой вопрос по ссылке: Дата пошла не так при использовании формата даты Momentjs в IE 11

person Prabha    schedule 28.06.2020

Вы можете передать L методу format, который обрабатывает интернационализацию ...

moment.locale('en-US');
moment().format("L");
> "06/23/2021"

moment.locale('fr');
moment().format("L");
> "23/06/2021"

Другие форматы длинных дат (fr локаль):

LT : 'HH:mm',
LTS : 'HH:mm:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY HH:mm',
LLLL : 'dddd D MMMM YYYY HH:mm'
person Dunc    schedule 23.06.2021

person    schedule
comment
Было бы полезно, если бы вы объяснили как этот код решает проблему OP. - person Robert Columbia; 12.08.2019