题 如何格式化JavaScript日期


如何格式化要打印的JavaScript日期对象 10-Aug-2010


1265
2017-08-23 23:28


起源


像往常一样:注意月份是零指数!所以一月是零而不是一个...... - Christophe Roussy
还要注意, myDate.getDay() 没有返回星期几,但是 工作日的位置 与本周有关。 myDate.getDate() 返回 当前的工作日。 - Jimenemex
要在javascript中格式化DateTimes,请使用 Intl.DateTimeFormat 目的。我在帖子中描述它: 岗位。我为您的答案创建了一个在线解决方案 Intl.DateTimeFormat  在线查看 - Iman Bahrampour


答案:


注意:下面有更好的答案。这个答案写于2010年,从那时起就有了更新更好的解决方案。 OP应接受另一个答案。

function formatDate(date) {
  var monthNames = [
    "January", "February", "March",
    "April", "May", "June", "July",
    "August", "September", "October",
    "November", "December"
  ];

  var day = date.getDate();
  var monthIndex = date.getMonth();
  var year = date.getFullYear();

  return day + ' ' + monthNames[monthIndex] + ' ' + year;
}

console.log(formatDate(new Date()));  // show current date-time in console

您可以编辑该阵列 monthNames 使用Jan,Feb,Mar等。


864
2017-08-23 23:35



真的考虑使用像Moment.js或Date.js这样的库。这个问题已经解决了很多次。 - Benjamin Oakes
为什么他们不包括函数 Date 反对这样做? - Nayan
一个重点是getMonth()方法返回一个基于0的月份索引,所以例如1月将返回0 2月将返回1,等等... - Marko
moment.js 2.9.0是 11.6K gzipped,这个例子是 211个字节 gzip压缩。 - mrzmyr
应该注意的是,您永远不应该使用document.write()。巨大的安全性和性能问题。 - Matt Jensen


使用 toLocaleDateString();

toLocaleDateString() method返回一个字符串,其中包含日期日期部分的语言敏感表示。 locales和options参数允许应用程序指定应使用其格式约定的语言,并允许自定义函数的行为。

您可以在不同键的选项中传递的值:

  1. 天: 
    当天的代表。
    可能的值为“数字”,“2位”。
  2. 工作日: 
    工作日的代表。
    可能的值是“窄”,“短”,“长”。
  3. 年: 
    年度代表。
    可能的值为“数字”,“2位”。
  4. 月: 
    本月的代表。
    可能的值为“数字”,“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

参考文献:


790
2017-12-01 08:11



向下滚动真的很值得。你的回答击败了300多票的人。做得好。 - Ryan Loggerythm
谢谢你这个有用的答案。这应该是公认的。做得好。 - Sammy
哦,我的主人,这是正确的答案。我无法相信Google对此信息的难度。 - M. Herold
几乎即将使用 moment.js 对于简单的格式。幸运的是,进行了额外的谷歌搜索并发现已经存在原生API。保存了外部依赖项。真棒! - Leon li
似乎这个答案应该是最好的“当前”答案。还使用选项“hour12:true”来使用12小时与24小时格式。也许应该在答案中添加到您的摘要列表中。 - Doug Knudsen


使用 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/


524
2017-08-23 23:35



这似乎是更长的解决方案,但在使用日期的网站上进行压缩和使用将是更好的解决方案! - RobertPitt
此解决方案也可作为npm包提供: npmjs.com/package/dateformat - David
上述插件有14个未解决的问题。即使我找到了一个:( - Amit Kumar Gupta
我明白了 require is not defined - Hooli
OP要求JS解决方案 - Luke Pring


如果您需要使用纯JavaScript快速格式化日期,请使用 getDategetMonth + 1getFullYeargetHours 和 getMinutes

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

327
2018-05-16 07:02



简单的javascript,没有库 - 这就是我需要的!谢谢! - lorem monkey
前缀“0”.slice(-2)是确保填充零的非常好的方法。 Melikes - Nicholi
加上一个快速纯粹的JavaScript解决方案。 - aero
@Nicholi,伟大而富有创意的解决方案。谢谢! - aero
最好的一个对我有用的。谢谢@sebastian - Code Spark


好吧,我想要的是将今天的日期转换为 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);
}

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


303
2018-06-23 18:49



你可以做 new Date(date + " UTC") 欺骗时区,你可以消除setMinutes线。男人,javascript很脏 - Vajk Hermecz
不兼容Y10K :( - slang
Y10K兼容版本: var today = new Date().toISOString().slice(0,-14) :) - Alex Shaffer
或者像这样 new Date().toISOString().split('T')[0] - rofrol
很好的答案,并且在记录中没有人会在10,000年使用计算机。 “1和0?傻瓜!难怪他们死了。” - Geek Stocks


如果你是 已经在使用jQuery UI 在你的项目中你可以这样做:

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

// formatted will be 'Jul 8, 2014'

可以使用一些日期选择器日期格式选项 这里


157
2017-07-09 13:52



正如我所说 - 如果已经在项目中使用jQueryUI - 为什么不重用datepicker日期格式化功能?嘿伙计们,我不会理解为什么我会对我的回答进行否定投票?请解释。 - Dmitry Pavlov
这可能是因为有人可能只为日期格式函数包含jQuery UI,或者可能是因为datepicker是库的可选部分,但可能是因为讨厌jQuery很时髦。 - sennett
我认为不可能完全避免某人可能做错误或缺乏意识的所有奇怪决定。 - Dmitry Pavlov
@sennett:讨厌jQuery很时尚?所以,你的裤子走到腿的一半,我想...这就是在没有jQuery的情况下尝试编码就像大多数JavaScript的历史...... - Michael Scheper
无论如何,这是一个有用且完全合理的答案 - 再次,70%的网站使用jQuery。由于开发者的宗教信仰,它不应该被低估。 - Michael Scheper


我想你可以使用 非标 日期方法 toLocaleFormat(formatString)

formatString的: 格式字符串,格式相同的格式 strftime() 功能在C.

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

参考文献:


113
2017-12-30 05:33



toLocaleFormat()似乎只适用于Firefox。 IE和Chrome都失败了。 - fitzgeraldsteele
Chrome有.toLocaleString('en')方法。因为看起来新浏览器支持这一点 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - apocalypz
在这里阅读警告: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - Carson Reinke
如果每个人都可以实现它,这将是最好的解决方案。该死的你/铬 - santa
@santa:的确如此。也许有一个公平的理由不遵循Mozilla的主导,但事实上即使ES6没有标准功能,这表明它仍然是黑客的语言,而不是开发人员的语言。 - Michael Scheper


自定义格式功能:

对于固定格式,一个简单的功能可以完成工作。以下示例生成国际格式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 class有一些特定的格式化函数:

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的Stringifier。

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


113
2018-04-12 09:09



真棒!....... - deFreitas
OP提出的最佳文档解决方案。太好了! - AXL