如何格式化JavaScript日期


2218

在JavaScript中,如何格式化日期对象以打印为10-Aug-2010


204
像往常一样:当心月份是零索引!因此,一月不是零...
Christophe Roussy 2015年

12
还请注意,myDate.getDay()不会返回星期几,而是将工作日位置与星期相关。myDate.getDate()返回当前工作日
Jimenemex

3
要在javascript中格式化DateTime,请使用Intl.DateTimeFormat对象。我在我的文章Post中对此进行了描述。我通过Intl.DateTimeFormat Check Online
Iman Bahrampour

5
您可以使用toLocaleDateString
onmyway133 '18

11
用JavaScript花费了很长时间,URL才成为标准对象,您可以在其中拔出查询参数键,获取协议,获取顶级域等。它们可以使ES6 ES7成为可能,但仍然不能仅将标准日期作为日期时间格式化程序/解析器在2019年?好像他们在想“嗯,是的...使用JavaScript的人需要定期处理时间和日期....”
ahnbizcad,

Answers:


1285

对于自定义分隔的日期格式,您必须从DateTimeFormat对象(属于ECMAScript Internationalization API的一部分)中提取日期(或时间)组件,然后手动使用所需的分隔符创建字符串。

为此,您可以使用DateTimeFormat#formatToParts

const date = new Date('2010-08-05')
const dateTimeFormat = new Intl.DateTimeFormat('en', { year: 'numeric', month: 'short', day: '2-digit' }) 
const [{ value: month },,{ value: day },,{ value: year }] = dateTimeFormat .formatToParts(date ) 

console.log(`${day}-${month}-${year }`)
console.log(`${day}👠${month}👢${year}`) // just for fun

您还可以DateTimeFormat使用来逐一提取部分内容DateTimeFormat#format,但请注意,使用此方法时,截至2020年3月,ECMAScript实现中存在一个错误,涉及到分钟和秒前导零(此错误被上述方法规避了)。

const d = new Date('2010-08-05')
const ye = new Intl.DateTimeFormat('en', { year: 'numeric' }).format(d)
const mo = new Intl.DateTimeFormat('en', { month: 'short' }).format(d)
const da = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(d)

console.log(`${da}-${mo}-${ye}`)

在处理日期和时间时,通常值得使用一个库(例如moment.jsluxon),因为该字段具有许多隐藏的复杂性。

请注意,IE10不支持上述解决方案中使用的ECMAScript国际化API (2020年2月全球浏览器市场份额为0.03%)。


368
真正考虑使用像Moment.js或Date.js这样的库。这个问题已经解决了很多遍了。
本杰明·奥克斯

239
他们为什么不在Date对象中包含一个函数来执行此操作?
Nayan 2014年

68
重要的一点是getMonth()方法返回基于0的月份索引,例如,一月将返回0,二月将返回1,依此
Marko 2014年

627
moment.js 2.9.0 压缩为11.6k,此示例压缩为211字节
mrzmyr

26
应该注意的是,永远不要使用document.write()。巨大的安全性和性能问题。
马特·詹森

2002

如果您需要的格式控制要比当前接受的答案少一些,Date#toLocaleDateString可以用来创建标准的特定于语言环境的渲染。在localeoptions论据让应用程序指定其格式约定应该使用的语言,并允许渲染的一些定制。

选项关键示例:

  1. 日:日
    的代表。
    可能的值为“数字”,“ 2位”。
  2. 工作日:工作日
    的表示形式。
    可能的值为“ narrow”,“ short”,“ long”。
  3. year:年份
    的表示形式。
    可能的值为“数字”,“ 2位”。
  4. month:月份
    的表示形式。
    可能的值为“数字”,“ 2位”,“窄”,“短”,“长”。
  5. 小时:小时
    的表示形式。
    可能的值为“数字”,“ 2位”。
  6. 分钟:分钟 的表示形式。
    可能的值为“数字”,“ 2位”。
  7. 第二:第二个
    的表示形式。
    可能的值为“数字”,“ 2位数字”。

所有这些键都是可选的。您可以根据需要更改选项值的数量,这也将反映每个日期时间项的存在。

注意:如果只想配置内容选项,但仍使用当前语言环境,则传递null第一个参数将导致错误。使用undefined代替。

对于不同的语言:

  1. “ en-US”:英语
  2. “ hi-IN”:用于印地语
  3. “ ja-JP”:对于日语

您可以使用更多语言选项。

例如

var options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
var today  = new Date();

console.log(today.toLocaleDateString("en-US")); // 9/17/2016
console.log(today.toLocaleDateString("en-US", options)); // Saturday, September 17, 2016
console.log(today.toLocaleDateString("hi-IN", options)); // शनिवार, 17 सितंबर 2016

您也可以toLocaleString()出于相同目的使用该方法。唯一的区别是此功能提供了您不传递任何选项的时间。

// Example
9/17/2016, 1:21:34 PM

参考文献:


45
几乎将moment.js用于一种简单的格式。幸运的是,做了一个额外的Google搜索,发现已经有本机API可以执行此操作。保存了外部依赖项。太棒了!
LeOn-Han Li

21
似乎此答案应该是最佳的“当前”答案。还使用选项“ hour12:true”来使用12小时格式和24小时格式。也许应该将其添加到答案的摘要列表中。
Doug Knudsen

14
我没有这个答案的支持。它不能解决问题中的问题。(即给我一个日期,看起来像是2010年8月10日)。使用toLocaleDateString()非常困难。date.format库似乎是更好的解决方案(至少对于Node用户而言)
Iarwa1n

3
如果通过undefined作为第一现场的参数随心所欲的感觉,你能传递价值"default",以利用浏览器的区域设置,每MDN文档developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
wbharding

3
@ Iarwa1n尚未提及此答案,但是您可以使用toLocaleDateString仅返回某些部分,然后可以根据需要加入。在下面检查我的答案。date.toLocaleDateString("en-US", { day: 'numeric' }) + "-"+ date.toLocaleDateString("en-US", { month: 'short' }) + "-" + date.toLocaleDateString("en-US", { year: 'numeric' })应该给16-Nov-2019
K Vij

609

使用date.format库

var dateFormat = require('dateformat');
var now = new Date();
dateFormat(now, "dddd, mmmm dS, yyyy, h:MM:ss TT");

返回:

Saturday, June 9th, 2007, 5:46:21 PM 

npm上的dateformat

http://jsfiddle.net/phZr7/1/


4
这似乎是更长的解决方案,但是在使用日期的网站上压缩并使用它会是更好的解决方案!
罗伯特·皮特(RobertPitt)2010年

5
此解决方案也可以npm软件包的形式提供:npmjs.com/package/dateformat
David

19
上面的插件有14个未解决的问题。甚至我找到了一个:(
Amit Kumar Gupta

6
我知道了require is not defined
Hooli

16
OP要求使用JS解决方案
Luke Pring

523

如果你需要使用普通的JavaScript,使用快速格式化你的日期getDategetMonth + 1getFullYeargetHoursgetMinutes

var d = new Date();

var datestring = d.getDate()  + "-" + (d.getMonth()+1) + "-" + d.getFullYear() + " " +
d.getHours() + ":" + d.getMinutes();

// 16-5-2015 9:50

或者,如果需要用零填充:

var datestring = ("0" + d.getDate()).slice(-2) + "-" + ("0"+(d.getMonth()+1)).slice(-2) + "-" +
    d.getFullYear() + " " + ("0" + d.getHours()).slice(-2) + ":" + ("0" + d.getMinutes()).slice(-2);

// 16-05-2015 09:50

你能告诉我如何获得2018年3月23日星期一这样的格式吗?
Sachin HR

@SachinHR,请参阅先前的答案:stackoverflow.com/a/34015511/4161032。在toLocaleDateString()可以使用本地化月/日的名称格式的日期。
sebastian.i,

12
你也可以垫与零.toString().padStart(2, '0')
班尼Jobigan

1
@DmitryoN,如果需要,可以用相同的方式填充年份:("000" + d.getFullYear()).slice(-4)
sebastian.i

4
@BennyJobigan应该指出的String.padStart()是,只有ECMAScript 2017才提供。–
JHH

413

好吧,我想要的是将今天的日期转换为MySQL友好的日期字符串,例如2012-06-23,并在我的一个查询中将该字符串用作参数。我发现的简单解决方案是:

var today = new Date().toISOString().slice(0, 10);

请记住,上述解决方案考虑您的时区偏移量。

您可以考虑改用以下功能:

function toJSONLocal (date) {
    var local = new Date(date);
    local.setMinutes(date.getMinutes() - date.getTimezoneOffset());
    return local.toJSON().slice(0, 10);
}

如果您在一天的开始/结束时间执行此代码,这将为您提供正确的日期。


9
您可以new Date(date + " UTC")欺骗时区,也可以消除setMinutes行。老兄,javascript很脏
Vajk Hermecz

23
Y10K兼容版本:var today = new Date().toISOString().slice(0,-14):)
Alex Shaffer,

22
还是这样new Date().toISOString().split('T')[0]
rofrol

4
new Date().toISOString().slice(0, 16).replace('T',' ')包括时间
Gerrie van Wyk '18

3
只是说时区的缺乏并不是“一天的开始/结束”带来的一些不便。例如,在澳大利亚,日期可能会错误,直到大约上午11点-将近半天!
史蒂夫·本内特

228

自定义格式功能:

对于固定格式,只需一个简单的功能即可完成。以下示例生成国际格式YYYY-MM-DD:

function dateToYMD(date) {
    var d = date.getDate();
    var m = date.getMonth() + 1; //Month from 0 to 11
    var y = date.getFullYear();
    return '' + y + '-' + (m<=9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d);
}

console.log(dateToYMD(new Date(2017,10,5))); // Nov 5

OP格式可能会生成为:

function dateToYMD(date) {
    var strArray=['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    var d = date.getDate();
    var m = strArray[date.getMonth()];
    var y = date.getFullYear();
    return '' + (d <= 9 ? '0' + d : d) + '-' + m + '-' + y;
}
console.log(dateToYMD(new Date(2017,10,5))); // Nov 5

注意:但是,扩展JavaScript标准库通常不是一个好主意(例如,通过将此函数添加到Date的原型中)。

更高级的功能可以根据格式参数生成可配置的输出。

如果编写格式化函数的时间太长,那么周围有很多函数库。其他一些答案已经列举出来了。但是,依赖关系的增加也有其反作用。

标准ECMAScript格式化功能:

由于ECMAScript是最新版本,因此Date该类具有一些特定的格式化功能:

toDateString:与实现有关,仅显示日期。

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.todatestring

new Date().toDateString(); // e.g. "Fri Nov 11 2016"

toISOString:显示ISO 8601日期和时间。

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.toisostring

new Date().toISOString(); // e.g. "2016-11-21T08:00:00.000Z"

toJSON:JSON的字符串化器。

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tojson

new Date().toJSON(); // e.g. "2016-11-21T08:00:00.000Z"

toLocaleDateString:与实现有关,以区域设置格式显示日期。

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocaledatestring

new Date().toLocaleDateString(); // e.g. "21/11/2016"

toLocaleString:与实现有关,日期和时间为区域设置格式。

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocalestring

new Date().toLocaleString(); // e.g. "21/11/2016, 08:00:00 AM"

toLocaleTimeString:与实现有关,以语言环境格式表示。

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocaletimestring

new Date().toLocaleTimeString(); // e.g. "08:00:00 AM"

toString:日期的通用toString。

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tostring

new Date().toString(); // e.g. "Fri Nov 21 2016 08:00:00 GMT+0100 (W. Europe Standard Time)"

注意:可以从这些格式中生成自定义输出>

new Date().toISOString().slice(0,10); //return YYYY-MM-DD

示例片段:

console.log("1) "+  new Date().toDateString());
console.log("2) "+  new Date().toISOString());
console.log("3) "+  new Date().toJSON());
console.log("4) "+  new Date().toLocaleDateString());
console.log("5) "+  new Date().toLocaleString());
console.log("6) "+  new Date().toLocaleTimeString());
console.log("7) "+  new Date().toString());
console.log("8) "+  new Date().toISOString().slice(0,10));


3
感谢您的最后一个。.对于设置HTML日期输入的日期值很有用。
daCoda

new Date().toLocaleDateString()给你,请mm/dd/yyyy不要dd/mm/yyyy更正那个。
Aarvy

1
@RajanVerma:toLocaleDateString提供您的语言环境,可能是mm / dd / yyyy,因为您在美国。在此,日期的语言环境为dd / mm / yyyy(恰好是“语言环境”的意思)。我写了“ eg”,因为它不是规范,而是输出的示例。
阿德里安·梅尔

177

如果您已经在项目中使用jQuery UI,则可以通过以下方式进行操作:

var formatted = $.datepicker.formatDate("M d, yy", new Date("2014-07-08T09:02:21.377"));

// formatted will be 'Jul 8, 2014'

一些datepicker日期格式选项可在此处使用


13
如我所说-如果已经在项目中使用jQueryUI-为什么不重新使用datepicker日期格式化功能?大家好,我不明白为什么我对自己的回答投了否定票?请解释。
德米特里·帕夫洛夫

7
这可能是因为有人可能只为日期格式功能包括了jQuery UI,或者可能是因为datepicker是库的可选部分,但可能是因为讨厌jQuery是一种时尚。
森尼特2014年

12
我认为不可能完全避免某人可能会因错误或缺乏理智而做出的所有奇怪决定。
德米特里·帕夫洛夫

7
@sennett:讨厌jQuery是时尚吗?因此,我想您的裤子要走到一半,我想……这在JavaScript的大部分历史中都非常类似于没有jQuery的尝试…
Michael Scheper

5
无论如何,这是一个有用且完全合理的答案-再次,70%的网站使用jQuery。它不应该因为开发人员的宗教信仰而被否决。
Michael Scheper

133

我认为您可以使用非标准的 Date方法toLocaleFormat(formatString)

formatString:格式字符串,格式strftime()与C中的函数期望的格式相同。

var today = new Date();
today.toLocaleFormat('%d-%b-%Y'); // 30-Dec-2011

参考文献:


160
toLocaleFormat()似乎仅在Firefox中有效。IE和Chrome都对我失败。
fitzgeraldsteele 2012年

16
Chrome具有.toLocaleString('en')方法。因为它似乎新的浏览器支持这个developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
apocalypz


6
如果每个人都可以实施它,那将是最好的解决方案。该死的你/铬
圣诞老人

6
@圣诞老人:的确如此。也许有充分的理由不遵循Mozilla的要求,但是即使ES6都没有为此提供标准功能的事实表明,它仍然是黑客的语言,而不是开发人员的语言。
Michael Scheper

105

普通的JavaScript是小型onetimers的最佳选择。

另一方面,如果您需要更多日期资料,MomentJS是一个很好的解决方案。

例如:

moment().format('YYYY-MM-DD HH:m:s');     // now() -> 2015-03-24 14:32:20
moment("20111031", "YYYYMMDD").fromNow(); // 3 years ago
moment("20120620", "YYYYMMDD").fromNow(); // 3 years ago
moment().startOf('day').fromNow();        // 11 hours ago
moment().endOf('day').fromNow();          // in 13 hours

2
重要的是要提:请不要使用YYYY,除非你知道之间的区别YYYYyyyystackoverflow.com/questions/15133549/...
DOMIN

@Domin特定于iOS中的NSDateFormatter,例如从Objective-C或Swift使用。这个问题与浏览器中的Javascript有关,并且此答案使用MomentJS,其中YYYY(不是yyyy)是标准年份,而GGGG(not YYYY)是基于ISO周的年份。
Mark Reed

2
时刻不算过时100%@Gerry
利亚姆

97

在现代浏览器(*)中,您可以执行以下操作:

var today = new Date().toLocaleDateString('en-GB', {
    day : 'numeric',
    month : 'short',
    year : 'numeric'
}).split(' ').join('-');

如果今天(2016年1月24日)执行,则输出:

'24-Jan-2016'

(*) 据MDN称,“现代浏览器”是指Chrome 24 +,Firefox 29 +,Internet Explorer 11,Edge 12 +,Opera 15+和Safari 每晚构建的版本


有没有一种方法可以检查是否支持此功能,如果不支持,默认为更简单的解决方案?
James Wierzba

@JamesWierzba:您可以使用 polyfill !
John Slegers

这甚至没有在caniuse.com上列出:/
Charles Wood

51

你应该看看date.js。它为日期添加了许多方便的助手,例如,在您的情况下:

var date = Date.parse('2010-08-10');
console.log(date.toString('dd-MMM-yyyy'));

入门:http//www.datejs.com/2007/11/27/getting-started-with-datejs/


谢谢。这是一个非常全面和完整的库,占用空间很小。
米切尔(Micheljh)

我认为当前我从Date.parse获取一个数字,而let date = new Date(fromString)具有更多功能。不幸的是,令我惊讶的是,toString似乎也只是显示默认值,而没有解释传递的参数来设置其格式。使用NodeJS 11+ toDateString是较短的输出,但不进行格式化。我所看到的是一个非常复杂的toLocaleDateString
Master James

38

我可以不使用任何库,不使用任何Date方法(仅使用正则表达式)而在一行中获取您请求的格式:

var d = (new Date()).toString().replace(/\S+\s(\S+)\s(\d+)\s(\d+)\s.*/,'$2-$1-$3');
// date will be formatted as "14-Oct-2015" (pass any date object in place of 'new Date()')

在我的测试中,此方法在主要的浏览器(Chrome,Safari,Firefox和IE)中均能可靠地工作。正如@RobG指出的那样,Date.prototype.toString()的输出取决于实现,因此只需测试一下输出即可确保它可以在您的JavaScript引擎中正常运行。您甚至可以添加一些代码来测试字符串输出,并确保它与您期望的匹配,然后再进行正则表达式替换。


console.log(new Date().toString().replace(/\S+\s(\S+)\s(\d+)\s(\d+)\s.*/,'$2-$1-$3'));
约翰

@André-我同意。如果这是我的代码,我肯定会在其旁边加上一条注释,以解释正则表达式并给出输入和相应输出的示例。
JD史密斯

时间部分(HH:mm:ss)呢?
unruledboy

@unruledboy var d =(新的Date())。toString()。replace(/ \ S + \ s(\ S +)\ s(\ d +)\ s(\ d +)\ s(\ S +)\ s。* / ,'$ 2- $ 1- $ 3 $ 4'); -或仅获取不含日期本身的时间部分,请使用:var d =(new Date())。toString()。replace(/ \ S + \ s(\ S +)\ s(\ d +)\ s(\ d +)\ s(\ S +)\ s。* /,'$ 4');
JD史密斯

37

@Sébastien-替代所有浏览器支持

new Date(parseInt(496407600)*1000).toLocaleDateString('de-DE', {
year: 'numeric',
month: '2-digit',
day: '2-digit'
}).replace(/\./g, '/');

文档:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString


5
除了执行.replace()之外,您还可以简单地使用“ en-GB”作为语言环境。:)
Roberto14

1
这真的很好,例如new Date().toLocaleDateString("en-EN", {month: "short", weekday: "short", day: "2-digit", year: "numeric"})回报"Wed, Sep 06, 2017"
Peter T.

37

好的,我们有了一个叫做Intl的东西,这对如今用JavaScript格式化日期非常有用:

您的日期如下:

var date = '10/8/2010';

然后使用新的Date()更改为Date,如下所示:

date = new Date(date);

现在,您可以使用如下所示的语言环境列表以任何方式设置其格式:

date = new Intl.DateTimeFormat('en-AU').format(date); // Australian date format: "8/10/2010" 


date = new Intl.DateTimeFormat('en-US').format(date); // USA date format: "10/8/2010" 


date = new Intl.DateTimeFormat('ar-EG').format(date);  // Arabic date format: "٨‏/١٠‏/٢٠١٠"

如果您确实想要上面提到的格式,则可以执行以下操作:

date = new Date(Date.UTC(2010, 7, 10, 0, 0, 0));
var options = {year: "numeric", month: "short", day: "numeric"};
date = new Intl.DateTimeFormat("en-AU", options).format(date).replace(/\s/g, '-');

结果将是:

"10-Aug-2010"

有关更多信息,请参见Intl APIIntl.DateTimeFormat文档。


IE不支持
裤子

但是,只有IE11,IE10才被淘汰,这是可以理解的。来自caniuse的92%,非常不错caniuse.com/#search=datetimeformat
Tofandel

32

使用ECMAScript Edition 6(ES6 / ES2015)字符串模板:

let d = new Date();
let formatted = `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()}`;

如果需要更改定界符:

const delimiter = '/';
let formatted = [d.getFullYear(), d.getMonth() + 1, d.getDate()].join(delimiter);

30

打包解决方案: Luxon

如果你想使用一个解决方案,以适应一切,我强烈建议使用力信通(的现代化版本Moment.js),这也确实在许多地方/语言和大量的其他功能格式化。

Luxon托管在Moment.js网站上,由Moment.js开发人员开发,因为Moment.js具有开发人员想要解决但无法解决的局限性。

安装:

npm install luxonyarn add luxon(访问其他安装方法的链接)

例:

luxon.DateTime.fromISO('2010-08-10').toFormat('yyyy-LLL-dd');

产量:

2010年8月10日

手动解决方案

使用与Moment.js,Class DateTimeFormatter(Java)Class SimpleDateFormat(Java)类似的格式,我实现了一种全面的解决方案formatDate(date, patternStr),该代码易于读取和修改。您可以显示日期,时间,AM / PM等。有关更多示例,请参见代码。

例:

formatDate(new Date(), 'EEEE, MMMM d, yyyy HH:mm:ss:S')

formatDate在下面的代码段中实现)

产量:

2018年10月12日星期五18:11:23:445

单击“运行代码段”尝试代码。

日期和时间模式

yy= 2位数字的年份;yyyy=全年

M=数字月份;MM= 2位数的月份;MMM=短月份名称;MMMM=完整的月份名称

EEEE=工作日全名;EEE=简短的工作日名称

d=位数天;dd= 2位数的日期

h=上午/下午几个小时;hh=两位数字的上午/下午;H=小时;HH= 2位数小时

m=分钟;mm= 2位数分钟;aaa=上午/下午

s=秒;ss= 2位数秒

S =毫秒

var monthNames = [
  "January", "February", "March", "April", "May", "June", "July",
  "August", "September", "October", "November", "December"
];
var dayOfWeekNames = [
  "Sunday", "Monday", "Tuesday",
  "Wednesday", "Thursday", "Friday", "Saturday"
];
function formatDate(date, patternStr){
    if (!patternStr) {
        patternStr = 'M/d/yyyy';
    }
    var day = date.getDate(),
        month = date.getMonth(),
        year = date.getFullYear(),
        hour = date.getHours(),
        minute = date.getMinutes(),
        second = date.getSeconds(),
        miliseconds = date.getMilliseconds(),
        h = hour % 12,
        hh = twoDigitPad(h),
        HH = twoDigitPad(hour),
        mm = twoDigitPad(minute),
        ss = twoDigitPad(second),
        aaa = hour < 12 ? 'AM' : 'PM',
        EEEE = dayOfWeekNames[date.getDay()],
        EEE = EEEE.substr(0, 3),
        dd = twoDigitPad(day),
        M = month + 1,
        MM = twoDigitPad(M),
        MMMM = monthNames[month],
        MMM = MMMM.substr(0, 3),
        yyyy = year + "",
        yy = yyyy.substr(2, 2)
    ;
    // checks to see if month name will be used
    patternStr = patternStr
      .replace('hh', hh).replace('h', h)
      .replace('HH', HH).replace('H', hour)
      .replace('mm', mm).replace('m', minute)
      .replace('ss', ss).replace('s', second)
      .replace('S', miliseconds)
      .replace('dd', dd).replace('d', day)
      
      .replace('EEEE', EEEE).replace('EEE', EEE)
      .replace('yyyy', yyyy)
      .replace('yy', yy)
      .replace('aaa', aaa);
    if (patternStr.indexOf('MMM') > -1) {
        patternStr = patternStr
          .replace('MMMM', MMMM)
          .replace('MMM', MMM);
    }
    else {
        patternStr = patternStr
          .replace('MM', MM)
          .replace('M', M);
    }
    return patternStr;
}
function twoDigitPad(num) {
    return num < 10 ? "0" + num : num;
}
console.log(formatDate(new Date()));
console.log(formatDate(new Date(), 'dd-MMM-yyyy')); //OP's request
console.log(formatDate(new Date(), 'EEEE, MMMM d, yyyy HH:mm:ss.S aaa'));
console.log(formatDate(new Date(), 'EEE, MMM d, yyyy HH:mm'));
console.log(formatDate(new Date(), 'yyyy-MM-dd HH:mm:ss.S'));
console.log(formatDate(new Date(), 'M/dd/yyyy h:mmaaa'));

感谢@Gerry提出了Luxon。


1
顺便说一句,麻烦的SimpleDateFormat班级早在几年前就被班级所取代java.time.format.DateTimeFormatter
罗勒·布尔克

1
@BasilBourque,指出。它们都使用相同的模式。我在Java8之前的项目中工作了5年,所以我从没有接触过更新的东西。谢谢!
lewdev

请参阅用于Java 6和7的ThreeTen-Backport项目,以使用几乎相同的API 获得大多数java.time功能。
罗勒·布尔克

@BasilBourque感谢您的参考,但是我不再从事该项目了,但是当它出现时我一定会记住这一点。
lewdev

2
时机已过时,请使用luxon
格里(Gerry)

19

这是我刚编写的一些代码,用于处理我正在处理的项目的日期格式。它模仿了PHP日期格式化功能以满足我的需求。随意使用它,只是扩展已经存在的Date()对象。这可能不是最优雅的解决方案,但它可以满足我的需求。

var d = new Date(); 
d_string = d.format("m/d/Y h:i:s");

/**************************************
 * Date class extension
 * 
 */
    // Provide month names
    Date.prototype.getMonthName = function(){
        var month_names = [
                            'January',
                            'February',
                            'March',
                            'April',
                            'May',
                            'June',
                            'July',
                            'August',
                            'September',
                            'October',
                            'November',
                            'December'
                        ];

        return month_names[this.getMonth()];
    }

    // Provide month abbreviation
    Date.prototype.getMonthAbbr = function(){
        var month_abbrs = [
                            'Jan',
                            'Feb',
                            'Mar',
                            'Apr',
                            'May',
                            'Jun',
                            'Jul',
                            'Aug',
                            'Sep',
                            'Oct',
                            'Nov',
                            'Dec'
                        ];

        return month_abbrs[this.getMonth()];
    }

    // Provide full day of week name
    Date.prototype.getDayFull = function(){
        var days_full = [
                            'Sunday',
                            'Monday',
                            'Tuesday',
                            'Wednesday',
                            'Thursday',
                            'Friday',
                            'Saturday'
                        ];
        return days_full[this.getDay()];
    };

    // Provide full day of week name
    Date.prototype.getDayAbbr = function(){
        var days_abbr = [
                            'Sun',
                            'Mon',
                            'Tue',
                            'Wed',
                            'Thur',
                            'Fri',
                            'Sat'
                        ];
        return days_abbr[this.getDay()];
    };

    // Provide the day of year 1-365
    Date.prototype.getDayOfYear = function() {
        var onejan = new Date(this.getFullYear(),0,1);
        return Math.ceil((this - onejan) / 86400000);
    };

    // Provide the day suffix (st,nd,rd,th)
    Date.prototype.getDaySuffix = function() {
        var d = this.getDate();
        var sfx = ["th","st","nd","rd"];
        var val = d%100;

        return (sfx[(val-20)%10] || sfx[val] || sfx[0]);
    };

    // Provide Week of Year
    Date.prototype.getWeekOfYear = function() {
        var onejan = new Date(this.getFullYear(),0,1);
        return Math.ceil((((this - onejan) / 86400000) + onejan.getDay()+1)/7);
    } 

    // Provide if it is a leap year or not
    Date.prototype.isLeapYear = function(){
        var yr = this.getFullYear();

        if ((parseInt(yr)%4) == 0){
            if (parseInt(yr)%100 == 0){
                if (parseInt(yr)%400 != 0){
                    return false;
                }
                if (parseInt(yr)%400 == 0){
                    return true;
                }
            }
            if (parseInt(yr)%100 != 0){
                return true;
            }
        }
        if ((parseInt(yr)%4) != 0){
            return false;
        } 
    };

    // Provide Number of Days in a given month
    Date.prototype.getMonthDayCount = function() {
        var month_day_counts = [
                                    31,
                                    this.isLeapYear() ? 29 : 28,
                                    31,
                                    30,
                                    31,
                                    30,
                                    31,
                                    31,
                                    30,
                                    31,
                                    30,
                                    31
                                ];

        return month_day_counts[this.getMonth()];
    } 

    // format provided date into this.format format
    Date.prototype.format = function(dateFormat){
        // break apart format string into array of characters
        dateFormat = dateFormat.split("");

        var date = this.getDate(),
            month = this.getMonth(),
            hours = this.getHours(),
            minutes = this.getMinutes(),
            seconds = this.getSeconds();
        // get all date properties ( based on PHP date object functionality )
        var date_props = {
            d: date < 10 ? '0'+date : date,
            D: this.getDayAbbr(),
            j: this.getDate(),
            l: this.getDayFull(),
            S: this.getDaySuffix(),
            w: this.getDay(),
            z: this.getDayOfYear(),
            W: this.getWeekOfYear(),
            F: this.getMonthName(),
            m: month < 10 ? '0'+(month+1) : month+1,
            M: this.getMonthAbbr(),
            n: month+1,
            t: this.getMonthDayCount(),
            L: this.isLeapYear() ? '1' : '0',
            Y: this.getFullYear(),
            y: this.getFullYear()+''.substring(2,4),
            a: hours > 12 ? 'pm' : 'am',
            A: hours > 12 ? 'PM' : 'AM',
            g: hours % 12 > 0 ? hours % 12 : 12,
            G: hours > 0 ? hours : "12",
            h: hours % 12 > 0 ? hours % 12 : 12,
            H: hours,
            i: minutes < 10 ? '0' + minutes : minutes,
            s: seconds < 10 ? '0' + seconds : seconds           
        };

        // loop through format array of characters and add matching data else add the format character (:,/, etc.)
        var date_string = "";
        for(var i=0;i<dateFormat.length;i++){
            var f = dateFormat[i];
            if(f.match(/[a-zA-Z]/g)){
                date_string += date_props[f] ? date_props[f] : '';
            } else {
                date_string += f;
            }
        }

        return date_string;
    };
/*
 *
 * END - Date class extension
 * 
 ************************************/

18

不使用任何外部库的JavaScript解决方案:

var now = new Date()
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
var formattedDate = now.getDate() + "-" + months[now.getMonth()] + "-" + now.getFullYear()
alert(formattedDate)



15

我们有很多解决方案,但是我认为其中最好的就是Moment.js。因此,我个人建议使用Moment.js进行日期和时间操作。

console.log(moment().format('DD-MMM-YYYY'));
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>


你为什么要包括jQuery?
Ced

1
哦,抱歉,不需要。感谢@Ced
Vijay Maheriya '16

如何提供我要使用moment.js的日期?我认为这总是需要时间。
Dave Ranjan

1
@DaveRanjan我认为您需要转换您的自定义日期。所以使用这个:console.log(moment('2016-08-10')。format('DD-MMM-YYYY'));
Vijay Maheriya

是的,后来知道了。谢谢:)
Dave Ranjan

15

在JavaScript中格式化日期时间的一种有用且灵活的方法是Intl.DateTimeFormat

var date = new Date();
var options = { year: 'numeric', month: 'short', day: '2-digit'};
var _resultDate = new Intl.DateTimeFormat('en-GB', options).format(date);
// The _resultDate is: "12 Oct 2017"
// Replace all spaces with - and then log it.
console.log(_resultDate.replace(/ /g,'-'));

结果是: "12-Oct-2017"

可以使用options参数自定义日期和时间格式。

Intl.DateTimeFormat对象是启用语言敏感日期和时间格式的对象的构造函数。

句法

new Intl.DateTimeFormat([locales[, options]])
Intl.DateTimeFormat.call(this[, locales[, options]])

参量

语言环境

可选的。具有BCP 47语言标记的字符串,或此类字符串的数组。有关locales参数的一般形式和解释,请参见Intl页面。允许使用以下Unicode扩展名:

nu
Numbering system. Possible values include: "arab", "arabext", "bali", "beng", "deva", "fullwide", "gujr", "guru", "hanidec", "khmr", "knda", "laoo", "latn", "limb", "mlym", "mong", "mymr", "orya", "tamldec", "telu", "thai", "tibt".
ca
Calendar. Possible values include: "buddhist", "chinese", "coptic", "ethioaa", "ethiopic", "gregory", "hebrew", "indian", "islamic", "islamicc", "iso8601", "japanese", "persian", "roc".

选件

可选的。具有以下某些或全部属性的对象:

localeMatcher

要使用的语言环境匹配算法。可能的值为"lookup""best fit"; 默认值为"best fit"。有关此选项的信息,请参见国际页面。

时区

使用的时区。实现唯一必须认识的价值是"UTC"; 默认值是运行时的默认时区。实现也可以识别IANA时区数据库的时区名称,例如"Asia/Shanghai""Asia/Kolkata""America/New_York"

小时12

是否使用12小时制(而不是24小时制)。可能的值为truefalse; 默认值取决于地区。

formatMatcher

要使用的格式匹配算法。可能的值为"basic""best fit"; 默认值为"best fit"。有关使用此属性的信息,请参见以下段落。

以下属性描述了要在格式化输出中使用的日期时间组件及其所需的表示形式。需要实现以至少支持以下子集:

weekday, year, month, day, hour, minute, second
weekday, year, month, day
year, month, day
year, month
month, day
hour, minute, second
hour, minute

实施可以支持其他子集,并且将针对所有可用的子集表示组合协商请求以找到最佳匹配。有两种算法可用于此协商,并由formatMatcher属性选择:完全指定的"basic"算法和与实现有关的“最佳匹配”算法。

平日

工作日的表示形式。可能的值是"narrow""short""long"

时代

时代的代表。可能的值是"narrow""short""long"

年份的表示形式。可能的值"numeric""2-digit"

月份的表示形式。可能的值是"numeric""2-digit""narrow""short""long"

一天的表示形式。可能的值"numeric""2-digit"

小时

小时的表示形式。可能的值"numeric""2-digit"

分钟

分钟的表示形式。可能的值"numeric""2-digit"

第二

第二个的表示形式。可能的值"numeric""2-digit"

timeZoneName

时区名称的表示形式。可能的值"short""long"。每个日期时间组件属性的默认值都未定义,但是如果所有组件属性都未定义,则假定年,月和日为"numeric"

在线查询

更多细节


15

这可能有助于解决问题:

var d = new Date();

var options = {   
    day: 'numeric',
    month: 'long', 
    year: 'numeric'
};

console.log(d.toLocaleDateString('en-ZA', options));

查找格式的日期


2
或者d.toLocaleDateString('en-US', options);如果您在美国。
BishopZ

这是我的解决方案。谢谢。
史蒂文·罗杰斯

13

这就是我为npm插件实现的方式

var monthNames = [
  "January", "February", "March",
  "April", "May", "June", "July",
  "August", "September", "October",
  "November", "December"
];

var Days = [
  "Sunday", "Monday", "Tuesday", "Wednesday",
  "Thursday", "Friday", "Saturday"
];

var formatDate = function(dt,format){
  format = format.replace('ss', pad(dt.getSeconds(),2));
  format = format.replace('s', dt.getSeconds());
  format = format.replace('dd', pad(dt.getDate(),2));
  format = format.replace('d', dt.getDate());
  format = format.replace('mm', pad(dt.getMinutes(),2));
  format = format.replace('m', dt.getMinutes());
  format = format.replace('MMMM', monthNames[dt.getMonth()]);
  format = format.replace('MMM', monthNames[dt.getMonth()].substring(0,3));
  format = format.replace('MM', pad(dt.getMonth()+1,2));
  format = format.replace(/M(?![ao])/, dt.getMonth()+1);
  format = format.replace('DD', Days[dt.getDay()]);
  format = format.replace(/D(?!e)/, Days[dt.getDay()].substring(0,3));
  format = format.replace('yyyy', dt.getFullYear());
  format = format.replace('YYYY', dt.getFullYear());
  format = format.replace('yy', (dt.getFullYear()+"").substring(2));
  format = format.replace('YY', (dt.getFullYear()+"").substring(2));
  format = format.replace('HH', pad(dt.getHours(),2));
  format = format.replace('H', dt.getHours());
  return format;
}

pad = function(n, width, z) {
  z = z || '0';
  n = n + '';
  return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}

您指的是哪个包裹?
lbrahim '16

这有一个错误:月名称先被替换,然后月名称也将被替换。例如March将成3arch为此代码。
ntaso

1
变更线'M',以format = format.replace("M(?!M)", (dt.getMonth()+1).toString());并把它上面的配合'MMMM'
ntaso


8

Sugar.js对Date对象具有出色的扩展,包括Date.format方法。

文档中的示例:

Date.create().format('{Weekday} {Month} {dd}, {yyyy}');

Date.create().format('{12hr}:{mm}{tt}')

8

对于希望寻找一种非常简单的ES6解决方案进行复制,粘贴和采用的人:

const dateToString = d => `${d.getFullYear()}-${('00' + (d.getMonth() + 1)).slice(-2)}-${('00' + d.getDate()).slice(-2)}` 

// how to use:
const myDate = new Date(Date.parse('04 Dec 1995 00:12:00 GMT'))
console.log(dateToString(myDate)) // 1995-12-04


8

截至2019年,您似乎可以获取toLocaleDateString仅返回某些部分,然后可以根据需要加入它们:

var date = new Date();

console.log(date.toLocaleDateString("en-US", { day: 'numeric' }) 
            + "-"+ date.toLocaleDateString("en-US", { month: 'short' })
            + "-" + date.toLocaleDateString("en-US", { year: 'numeric' }) );

> 16-Nov-2019

console.log(date.toLocaleDateString("en-US", { month: 'long' }) 
            + " " + date.toLocaleDateString("en-US", { day: 'numeric' }) 
            + ", " + date.toLocaleDateString("en-US", { year: 'numeric' }) );

> November 16, 2019

8

您应该看一下DayJs, 它是对momentJs的重制,但是面向模块化架构的框架却更轻巧。

使用相同的现代API快速替代Moment.js的2kB

Day.js是一个极简主义的JavaScript库,它使用兼容Moment.js的API来解析,验证,操纵和显示现代浏览器的日期和时间。如果使用Moment.js,您已经知道如何使用Day.js。

var date = Date.now();
const formatedDate = dayjs(date).format("YYYY-MM-DD")
console.log(formatedDate);
<script src="https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.8.16/dayjs.min.js" crossorigin="anonymous"></script>


7

要获取“ 2010年8月10日”,请尝试:

var date = new Date('2010-08-10 00:00:00');
date = date.toLocaleDateString(undefined, {day:'2-digit'}) + '-' + date.toLocaleDateString(undefined, {month:'short'}) + '-' + date.toLocaleDateString(undefined, {year:'numeric'})

有关浏览器的支持,请参见toLocaleDateString


我不需要“-”,这是带有时间,日期和时区的较短版本!date = new Date(); date.toLocaleDateString(未定义,{day:'2位数',month:'short',year:'numeric',hour:'numeric',分钟:'numeric',timeZoneName:'short'})); :)
varun
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.