在JavaScript中将日期格式化为MM/dd/yyyy

207

我有一个日期格式如下:'2010-10-11T00:00:00+05:30'。我需要使用JavaScript或jQuery将其格式化为MM/dd/yyyy。请帮我完成这个任务。


16
这怎么算是重复问题呢?一个人问文档在哪里,另一个人问如何将日期格式化为特定格式... - Joshua Robinson
2
不确定为什么每个人总是将字符串相加来实现这个,而不使用 toLocaleDateString,后者更加简洁:function getDate(str) {var ops = {year: 'numeric'}; ops.month = ops.day = '2-digit'; return new Date(str).toLocaleDateString(0, ops);} - omikes
@omikes 我无法在ServiceNow平台上使您的函数工作 var testGetDate = getDate('2010-10-11T00:00:00+05:30');。不确定原因,但它在jsconsole.com上可以正常工作。 - Paul Hegel
2
现在正确的解决方法是使用 Intl.DateTimeFormat API。 - Wolfgang Kuehn
是的,同意,例如:new Intl.DateTimeFormat('en-US').format(date) - https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat - chrismarx
3个回答

313

尝试一下;请记住JavaScript中的月份是从0开始索引的,而日期是从1开始索引的。

var date = new Date('2010-10-11T00:00:00+05:30');
    alert(((date.getMonth() > 8) ? (date.getMonth() + 1) : ('0' + (date.getMonth() + 1))) + '/' + ((date.getDate() > 9) ? date.getDate() : ('0' + date.getDate())) + '/' + date.getFullYear());


4
编辑上面的内容以解释JavaScript的月份是以零为基础的事实...在向用户显示数据时,必须始终将月份加一才能得到确切的月份。 - Robert Petz
93
实际上那不是MM/dd/yyyy格式,而是M/d/yyyy格式。你的日期需要前导零吗? - Ray Wadkins
6
如果使用Angular,您可能需要考虑:https://docs.angularjs.org/api/ng/filter/date - Soferio
3
同意这个答案是不正确的,它无法生成 mm/dd/yyyy 的日期格式。 - Rob Breidecker
5
正确的答案应该是:var result = ((date.getMonth().toString().length > 1) ? (date.getMonth() + 1) : ('0' + (date.getMonth() + 1))) + '/' + ((date.getDate().toString().length > 1) ? date.getDate() : ('0' + date.getDate())) + '/' + date.getFullYear()该代码段用于将日期格式化为 "月/日/年" 的形式。代码中使用了三个变量,分别是月份、日期和年份,然后将它们拼接在一起,中间用斜杠隔开。其中,对于月份和日期的格式,通过判断它们的长度是否大于 1 来确定是否需要在前面补零。 - Jyotirmaya Prusty
显示剩余10条评论

210

有些答案并不能完全解决这个问题。它们以mm/dd/yyyy的格式打印日期,但问题是关于MM/dd/yyyy的。注意到微妙的区别了吗?MM表示如果月份为单个数字,则必须在月份前添加一个零,因此月份始终成为两位数。

例如,mm/dd将是3/31,而MM/dd将是03/31。

我创建了一个简单的函数来实现这一点。请注意,这种填充不仅适用于月份,而且还适用于月份中的日期,事实上生成的是MM/DD/yyyy:

function getFormattedDate(date) {
  var year = date.getFullYear();

  var month = (1 + date.getMonth()).toString();
  month = month.length > 1 ? month : '0' + month;

  var day = date.getDate().toString();
  day = day.length > 1 ? day : '0' + day;
  
  return month + '/' + day + '/' + year;
}


使用 String.padStart() 进行 ES2017 更新,所有主要浏览器都支持,除了 IE。

function getFormattedDate(date) {
    let year = date.getFullYear();
    let month = (1 + date.getMonth()).toString().padStart(2, '0');
    let day = date.getDate().toString().padStart(2, '0');
  
    return month + '/' + day + '/' + year;
}


3
对于 'Sat Jun 01 2013 00:00:00 GMT-0400 (Eastern Summer Time)',返回的结果是 '2013/15/06'。 - Code Monkey
4
_@Ore4444_,在将月份加1之前,您将其转换为字符串,这就是为什么 @Code Monkey 说您返回的是15而不是6。正确的写法应该是var month = (1 + date.getMonth()).toString(); - Moses Machua
3
getDay 返回一周中的星期几。如果要获取日期中的天数,您需要使用 getDate()。 - gh9
5
@Ankur:你可以使用Moment.js的提示代码,而不是在每个答案下复制您的评论。请提供如何使用Moment.js的代码示例。 - phil
1
函数 getFormattedDate(date) { var start = new Date(date); var year = start.getFullYear(); var month = (1 + start.getMonth()).toString(); month = month.length > 1 ? month : '0' + month; var day = start.getDate().toString(); day = day.length > 1 ? day : '0' + day; return day + '/' + month + '/' + year; } - Glyn
显示剩余8条评论

58

符合ISO标准的日期字符串

如果日期字符串符合RFC282ISO8601标准:
将字符串传递给Date构造函数。 然后,要将其格式化为所需的日期输出,请使用Intl.DateTimeFormat,如下所示:

const dateString = "2020-09-30T12:52:27+05:30"; // ISO8601 compliant dateString
const date = new Date(dateString); // {object Date}            

const dateFormatted = new Intl.DateTimeFormat("en-US", {
  year: "numeric",
  month: "2-digit",
  day: "2-digit"
}).format(date);

console.log(dateFormatted); // "09/30/2020"

或者,我们可以通过使用Date Getters来提取所需的值:
date.getMonth() + 1  // 9   (PS: use +1 since Month returns 0-based index)
date.getDate()       // 30
date.getFullYear()   // 2020

在上面的例子中,如果需要的话,你可能还想使用String.prototype.padStart来为月份和日期添加前导零。

非标准日期字符串

如果是非标准日期字符串:
将字符串拆分为已知部分,然后将变量传递给日期构造函数

new Date(年份, 月份索引 [, 日 [, 小时 [, 分钟 [, 秒 [, 毫秒]]]]])

const dateString = "30/09/2020 12:52:27"; // Not ISO8601 compliant
const [d, M, y, h, m, s] = dateString.match(/\d+/g);

// PS: M-1 since Month is 0-based
const date = new Date(Date.UTC(y, M-1, d, h, m, s));  // {object Date}

const dateFormatted = new Intl.DateTimeFormat("en-US", {
  year: "numeric",
  month: "2-digit",
  day: "2-digit"
}).format(date);

console.log(dateFormatted); // "09/30/2020"


你把日期和月份搞混了。2010-10-11 应该是 10/11/2010。 - isick
真的考虑使用像 Moment.js 这样的库。它可以格式化出所需的结果 :) - Ankur
1
@RokoC.Buljan 如何在JavaScript中将“Month dd,yyyy”转换为“MM / dd / yyyy”? - dilipkumar1007
8
Moment.js 对于简单的事情来说有些过于庞大了。可以尝试使用 date-format 替代。这样能缩短我的 Webpack 构建时间 5 秒钟。 - Eirik Birkeland
还有其他人注意到我们已经进入了2022年,但在JS中管理日期仍然是如此混乱吗 - 无论使用库与否。 - Dan Chase
显示剩余2条评论

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