使用Moment.js格式化日期

379

我有一个字符串是按照这种格式排列的:

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');

哪里出了问题并报错说没有名为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) 

1
你的代码中是否使用了 replace() 函数?如果没有,那么你所使用的插件在错误地调用了一个不存在的方法。 - cereallarceny
我已经更新了我的问题,并提供了精确的错误和堆栈跟踪,以及调用“replace”的方法。我根本没有直接调用replace。 - Warz
9个回答

795
moment() 的第二个参数是 解析格式,而不是 展示格式。如果需要展示格式,可以使用 .format() 方法
moment(testDate).format('MM/DD/YYYY');

同时请注意大小写的区分。对于“月份”、“月中日期”和“年份”的格式,应该使用大写字母。


1
非常好。我最初尝试使用moment().format(),但失败了。谢谢。 - Warz
变量 obj = {end_date: moment($scope.activity.endDate).format('MM/DD/YYYY')}; - Michael J. Calkins
@MichaelCalkins 对不起。这是干什么用的?还有,为什么要额外引用AngularJS($scope)? - Jonathan Lonowski
@JonathanLonowski 那可能是任何变量。我碰巧正在编程并寻找这个答案。只是一个例子。 - Michael J. Calkins
每当我使用格式化时,就无法在其上调用date()。因此,我不得不使用某种子字符串构造来从("DD-MM-YYYY")格式中获取日期。 - Henk Jansen
显示剩余4条评论

63

引入moment.js库,使用下面的代码可格式化日期

var formatDate= 1399919400000;

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

我的输出是“13/05/2014”


1
我该如何反转它?我的意思是,如果我有后一种格式,想将其更改为第一种格式。 - Arslan Tariq
2
@ArslanTariq 你可以使用 momentObject.valueOf() 来获取自纪元以来的毫秒数。 - WesternGun

43
moment().format();                                // "2019-08-12T17:52:17-05:00" (ISO 8601, no fractional seconds)
moment().format("dddd, MMMM Do YYYY, h:mm:ss a"); // "Monday, August 12th 2019, 5:52:00 pm"
moment().format("ddd, hA");                       // "Mon, 5PM"

2
如果您能解释一下这段代码是如何解决问题的,那将会很有帮助。 - Robert Columbia

22

您可能不再需要 Moment.js

Moment 是一个很棒的时间操作库,但它被认为是一个遗留项目,该团队建议使用其他

date-fns 是最好的轻量级库之一,它是模块化的,因此您可以选择您需要的函数并减小捆绑包大小(问题 & 声明)。

另一个反对在现代应用程序中使用 Moment 的常见观点是其大小。Moment 与现代的“树摇”算法不兼容,因此它往往会增加 Web 应用程序捆绑包的大小。

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


15
var moment = require('moment');

let yourdate = '2021-01-02T07:57:45.121Z'; // for example

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

// output : 01-02-2021


moment(yourdate).format('DD-MMM-YYYY');

// output : 01-Jan-2021

7

格式化输出日期,请使用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>


很好,首先我必须提供我们日期格式的标识符(格式),然后是所需的格式。不错的例子。 - Sudhir K Gupta

5
你可以将“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'

文档:https://momentjs.com/docs/#/displaying/format/(请参见“本地化格式”)


4

使用moment格式获取当前UTC时间,包括时区,并以YYYY-MM-DD HH:MM:ss.毫秒表示:

moment().utc().format('Y-MM-DD HH:mm:ss.SSS Z').  

输出

2022-09-20 15:28:39.446 +0000

2
也许这可以帮助那些无论出于意愿还是意外都在寻找多个日期格式的人。 请查看以下代码: 我正在使用moment.js格式函数处理当前日期(今天是2020年6月29日) var startDate = moment(new Date()).format('MM/DD/YY'); 结果:06/28/20
发生的情况是它仅保留了年份部分:20作为“06/28/20”,之后如果我运行语句: new Date(startDate) 结果是“Mon Jun 28 1920 00:00:00 GMT+0530 (India Standard Time)”
然后,当我在"06/28/20"上使用另一种格式时:startDate = moment(startDate).format('MM-DD-YYYY'); 结果为:06-28-1920,在谷歌浏览器和火狐浏览器中,第二次尝试可以给出正确的日期:06-28-2020。但是在IE中存在问题,由此我了解到我们可以在给定日期上应用一个日期格式,如果我们想要第二个日期格式,它应该应用于新日期而不是第一个日期格式结果。还请注意,首次应用'MM-DD-YYYY',下一个是'MM-DD-YY'在IE中有效。为了更清楚地理解,请在链接中查找我的问题:在IE 11中使用Momentjs日期格式时日期出错

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接