我注意到JavaScript的新Date()函数在接受多种格式的日期方面非常聪明。

Xmas95 = new Date("25 Dec, 1995 23:15:00")
Xmas95 = new Date("2009 06 12,12:52:39")
Xmas95 = new Date("20 09 2006,12:52:39")

调用new Date()函数时,我在任何地方都找不到显示所有有效字符串格式的文档。

这用于将字符串转换为日期。如果我们从相反的方面来看,即将日期对象转换为字符串,直到现在,我的印象是JavaScript没有将日期对象格式化为字符串的内置API。

编者按:以下方法是询问者在特定浏览器上的尝试,但通常不起作用;请参阅本页上的答案以了解一些实际解决方案。

今天,我在date对象上使用了toString()方法,令人惊讶的是,它可以将日期格式化为字符串。

var d1 = new Date();
d1.toString('yyyy-MM-dd');       //Returns "2009-06-29" in Internet Explorer, but not Firefox or Chrome
d1.toString('dddd, MMMM ,yyyy')  //Returns "Monday, June 29,2009" in Internet Explorer, but not Firefox or Chrome

在这里,我也找不到任何关于将日期对象格式化为字符串的方法的文档。

列出Date()对象支持的格式说明符的文档在哪里?


当前回答

示例代码:

var d = new Date();
var time = d.toISOString().replace(/.*?T(\d+:\d+:\d+).*/, "$1");

输出:

"13:45:20"

其他回答

答案是“无处”,因为日期格式是专有功能。我不认为toString函数要符合特定的格式。例如在ECMAScript 5.1规范中(http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf,2013年2月8日,第173页),toString函数记录如下:

“字符串的内容取决于实现”

下面的示例等函数可以很容易地完成格式化。

function pad(toPad, padWith) {
    return (String(padWith) + String(toPad)).slice(-1 * padWith.length);
}

function dateAsInputValue(toFormat) {
    if(!(toFormat instanceof Date)) return null;
    return toFormat.getFullYear() + "-" + pad(toFormat.getMonth() + 1, "00") + "-" + pad(toFormat.getDate(), "00");
}

function timeAsInputValue(toFormat) {
    if(!(toFormat instanceof Date)) return null;        
    return pad(toFormat.getHours(), "00") + ":" + pad(toFormat.getMinutes(), "00") + ":" + pad(toFormat.getSeconds(), "00");
}

您引用的功能不是标准的Javascript,不太可能跨浏览器移植,因此不是很好的实践。ECMAScript 3规范将解析和输出格式功能留给Javascript实现。ECMAScript 5添加了ISO8601支持的子集。我相信你提到的toString()函数是一个浏览器的创新(Mozilla?)

有几个库提供了参数化这一点的例程,其中一些库提供了广泛的本地化支持。您还可以查看dojo.date.local中的方法。

无框架,有限但重量轻

var d = (new Date()+'').split(' ');
// ["Tue", "Sep", "03", "2013", "21:54:52", "GMT-0500", "(Central", "Daylight", "Time)"]

[d[3], d[1], d[2], d[4]].join(' ');
// "2013 Sep 03 21:58:03"

在浏览了其他答案中提供的几个选项后,我决定编写自己的有限但简单的解决方案,其他人可能也会觉得有用。

/**
* Format date as a string
* @param date - a date object (usually "new Date();")
* @param format - a string format, eg. "DD-MM-YYYY"
*/
function dateFormat(date, format) {
    // Calculate date parts and replace instances in format string accordingly
    format = format.replace("DD", (date.getDate() < 10 ? '0' : '') + date.getDate()); // Pad with '0' if needed
    format = format.replace("MM", (date.getMonth() < 9 ? '0' : '') + (date.getMonth() + 1)); // Months are zero-based
    format = format.replace("YYYY", date.getFullYear());
    return format;
}

示例用法:

console.log("The date is: " + dateFormat(new Date(), "DD/MM/YYYY"));

只是另一个选项,我写道:

DP_DateExtensions库

不确定它是否有用,但我发现它在几个项目中都很有用——看起来它可以满足您的需要。

支持日期/时间格式、日期数学(添加/减去日期部分)、日期比较、日期解析等。

如果你已经在使用一个框架(他们都有能力),没有理由考虑这个问题,但如果你只需要在项目中快速添加日期操作,那就给它一个机会。