在哪里可以找到在JavaScript中格式化日期的留档?

我注意到JavaScript的new 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来将日期对象格式化为字符串。

编者注:以下方法是asker尝试在特定浏览器上工作,但没有一般工作;查看此页面上的答案查看一些实际的解决方案。

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

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

同样在这里,我找不到任何留档的方式,我们可以格式化日期对象成一个字符串。

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

1540682 次浏览

我喜欢10种使用JavaScript格式化时间和日期的方法使用日期

基本上,你有三种方法,你必须为自己组合字符串:

getDate() // Returns the dategetMonth() // Returns the monthgetFullYear() // Returns the year

示例:

var d = new Date();var curr_date = d.getDate();var curr_month = d.getMonth() + 1; //Months are zero basedvar curr_year = d.getFullYear();console.log(curr_date + "-" + curr_month + "-" + curr_year);

在JavaScript中处理日期时,请确保您签出datejs。正如您在toString函数的情况下所看到的那样,它非常令人印象深刻并且有据可查。

编辑:Tyler Forsythe指出,datejs已经过时了。我在当前的项目中使用它并且没有任何问题,但是你应该意识到这一点并考虑替代方案。

另一个选择,我写的:

DP_DateExtensions库

不确定它是否会有帮助,但我发现它在几个项目中很有用-看起来它会做你需要的事情。

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

如果您已经在使用框架(它们都有能力),则没有理由考虑它,但如果您只需要快速将日期操作添加到项目中,请给它一个机会。

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

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

如果您已经在项目中使用jQueryUI,则可以使用内置的datepicker方法来格式化日期对象:

$.datepicker.formatDate('yy-mm-dd', new Date(2007, 1 - 1, 26));

但是,日期选择器只能格式化日期,不能格式化时间。

看看jQuery UI日期选择器格式日期,例子。

DateJS当然是全功能的,但我推荐这个更简单的lib(JavaScript日期格式),我更喜欢它,因为它只有120行左右。

在JavaScript中格式化,尤其是解析日期可能有点头疼。并非所有浏览器都以相同的方式处理日期。因此,虽然了解基本方法很有用,但使用辅助库更实用。

XDate javascript库 byadamshaw自2011年年中以来一直存在,并且仍在积极开发中。它具有出色的留档,出色的API,格式化,尝试保持向后兼容,甚至支持本地化字符串。

链接到更改语言环境字符串:https://gist.github.com/1221376

Moment.js

它是一个(轻量级)*JavaScript日期库,用于解析、操作和格式化日期。

var a = moment([2010, 1, 14, 15, 25, 50, 125]);a.format("dddd, MMMM Do YYYY, h:mm:ss a"); // "Sunday, February 14th 2010, 3:25:50 pm"a.format("ddd, hA");                       // "Sun, 3PM"

(*)轻量级意味着在尽可能小的设置中缩小9.3KB+gzip压缩(2014年2月)

日期格式JsSimpleDateFormat是一个可以格式化日期对象并将格式化后的字符串解析回Date对象的库。它使用Java格式(SimpleDateFormat类)。可以本地化月份和天的名称。

示例:

var sdf = new JsSimpleDateFormat("EEEE, MMMM dd, yyyy");var formattedString = sdf.format(new Date());var dateObject = sdf.parse("Monday, June 29, 2009");

自定义格式设置功能:

对于固定格式,一个简单的函数就可以完成这项工作。以下示例生成国际格式YYYY-MM-DD:

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

注意:但是,扩展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"

创建日期字符串:依赖于实现,区域设置格式的日期。

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"

创建时间字符串:依赖于实现,语言环境格式的时间。

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:Date的通用toString。

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

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

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

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

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

我今天偶然发现了这个,并且非常惊讶没有人花时间回答这个简单的问题。确实,有很多库可以帮助处理日期操作。有些比其他的更好。但这不是问的问题。

AFAIK,纯JavaScript不支持格式说明符你已经表明你想使用它们的方式。但它确实支持格式化日期和/或时间的方法,例如.toLocaleDateString().toLocaleTimeString().toUTCString()

我最常使用的Date对象引用是在w3schools.com网站上(但一个快速的谷歌搜索将揭示更多可能更好地满足您的需求)。

另请注意,日期对象属性部分提供了一个指向#0的链接,它说明了使用自定义方法扩展Date对象的一些方法。多年来,JavaScript社区中一直有一些辩论关于这是否是最佳实践,我不是支持或反对它,只是指出它的存在。

我做了这个非常简单的格式化程序,它是剪切/n/可传递的(更新了更整洁的版本):

function DateFmt(fstr) {this.formatString = fstr
var mthNames = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];var dayNames = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];var zeroPad = function(number) {return ("0"+number).substr(-2,2);}
var dateMarkers = {d:['getDate',function(v) { return zeroPad(v)}],m:['getMonth',function(v) { return zeroPad(v+1)}],n:['getMonth',function(v) { return mthNames[v]; }],w:['getDay',function(v) { return dayNames[v]; }],y:['getFullYear'],H:['getHours',function(v) { return zeroPad(v)}],M:['getMinutes',function(v) { return zeroPad(v)}],S:['getSeconds',function(v) { return zeroPad(v)}],i:['toISOString']};
this.format = function(date) {var dateTxt = this.formatString.replace(/%(.)/g, function(m, p) {var rv = date[(dateMarkers[p])[0]]()
if ( dateMarkers[p][1] != null ) rv = dateMarkers[p][1](rv)
return rv
});
return dateTxt}
}
fmt = new DateFmt("%w %d:%n:%y - %H:%M:%S  %i")v = fmt.format(new Date())

http://snipplr.com/view/66968.82825/

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

/*** 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 accordinglyformat = format.replace("DD", (date.getDate() < 10 ? '0' : '') + date.getDate()); // Pad with '0' if neededformat = format.replace("MM", (date.getMonth() < 9 ? '0' : '') + (date.getMonth() + 1)); // Months are zero-basedformat = format.replace("YYYY", date.getFullYear());return format;}

示例用法:

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

您可以使用meizz所述的新format方法扩展Date Object,下面是作者给出的代码。和这里有一个jsfiddle

Date.prototype.format = function(format) //author: meizz{var o = {"M+" : this.getMonth()+1, //month"d+" : this.getDate(),    //day"h+" : this.getHours(),   //hour"m+" : this.getMinutes(), //minute"s+" : this.getSeconds(), //second"q+" : Math.floor((this.getMonth()+3)/3),  //quarter"S" : this.getMilliseconds() //millisecond}
if(/(y+)/.test(format)) format=format.replace(RegExp.$1,(this.getFullYear()+"").substr(4 - RegExp.$1.length));for(var k in o)if(new RegExp("("+ k +")").test(format))format = format.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] :("00"+ o[k]).substr((""+ o[k]).length));return format;}
alert(new Date().format("yyyy-MM-dd"));alert(new Date("january 12 2008 11:12:30").format("yyyy-MM-dd h:mm:ss"));

格式化日期以返回“2012-12-29”的正确方法是使用JavaScript日期格式中的脚本:

var d1 = new Date();return d1.format("dd-m-yy");

此代码不起作用:

var d1 = new Date();d1.toString('yyyy-MM-dd');

答案是“无处不在”,因为日期格式是专有功能。我不认为toString函数旨在符合特定格式。例如,在ECMAScript 5.1规范(http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf,2/8/2013, page 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");}

就我个人而言,因为我同时使用PHP和jQuery/javascript,所以我使用php.jshttp://phpjs.org/functions/date/中的date函数

使用与我已经知道的格式字符串相同的库对我来说更容易,并且包含日期函数的所有格式字符串可能性的手册当然在php.net在线

您只需使用首选方法在超文本标记语言中包含date.js文件,然后像这样调用它:

var d1=new Date();var datestring = date('Y-m-d', d1.valueOf()/1000);

如果需要,可以使用d1.getTime()而不是value eOf(),它们做同样的事情。

javascript时间戳除以1000是因为javascript时间戳以毫秒为单位,而PHP时间戳以秒为单位。

许多框架(您可能已经在使用)都有您可能不知道的日期格式。jQueryUI已经提到了,但其他框架(如剑道UI(全球化)雅虎用户界面AngularJS)也有它们。

// 11/6/2000kendo.toString(new Date(value), "d")
// Monday, November 06, 2000kendo.toString(new Date(2000, 10, 6), "D")

如果您只想显示两个数字的时间,这可能会帮助您:

var now = new Date();var cHour = now.getHours();var cMinuts = now.getMinutes();var cSeconds = now.getSeconds();
var outStr = (cHour <= 0 ? ('0' + cHour) : cHour) + ':' + (cMinuts <= 9 ? ('0' + cMinuts) : cMinuts) + ':' + (cSeconds <= 9 ? '0' + cSeconds : cSeconds);

下面继续公知涛的实实在在的回答-这个处理AM/PM

 Date.prototype.format = function (format) //author: meizz{var hours = this.getHours();var ttime = "AM";if(format.indexOf("t") > -1 && hours > 12){hours = hours - 12;ttime = "PM";}
var o = {"M+": this.getMonth() + 1, //month"d+": this.getDate(),    //day"h+": hours,   //hour"m+": this.getMinutes(), //minute"s+": this.getSeconds(), //second"q+": Math.floor((this.getMonth() + 3) / 3),  //quarter"S": this.getMilliseconds(), //millisecond,"t+": ttime}
if (/(y+)/.test(format)) format = format.replace(RegExp.$1,(this.getFullYear() + "").substr(4 - RegExp.$1.length));for (var k in o) if (new RegExp("(" + k + ")").test(format))format = format.replace(RegExp.$1,RegExp.$1.length == 1 ? o[k] :("00" + o[k]).substr(("" + o[k]).length));return format;}

sugar.js有一些很棒的功能来处理JavaScript中的日期。它非常好记录

Sugar给了Date类很多爱,从Date.create开始方法可以理解日期几乎任何格式在15个主要语言,包括“1小时前”等相关格式。日期可以也可以使用易于理解的格式或语言输出语法,带有常用日期格式的快捷方式。复杂的日期与诸如is之类的方法进行比较也是可能的,它们理解任何格式化并应用内置精度。

举几个例子:

Date.create('July 4, 1776')  -> July 4, 1776Date.create(-446806800000)   -> November 5, 1955Date.create(1776, 6, 4)      -> July 4, 1776Date.create('1776年07月04日', 'ja') -> July 4, 1776Date.utc.create('July 4, 1776', 'en')  -> July 4, 1776
Date.create().format('{Weekday} {d} {Month}, {yyyy}')    -> Monday July 4, 2003Date.create().format('{hh}:{mm}')                        -> 15:57Date.create().format('{12hr}:{mm}{tt}')                  -> 3:57pmDate.create().format(Date.ISO8601_DATETIME)              -> 2011-07-05 12:24:55.528Z
Date.create().is('the 7th of June') -> falseDate.create().addMonths(2); ->"Sunday, June 15, 2014 13:39"

框架自由,有限但轻盈

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"

尽管JavaScript为您提供了许多很好的格式化和计算方法,但我更喜欢在应用程序开发过程中使用Moment.js(momentjs.com)库,因为它非常直观并节省了大量时间。

尽管如此,我建议每个人也学习基本的JavaScript API,以便更好地理解。

示例代码:

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

输出:

"13:45:20"

这是我经常使用的函数。结果是yyyy-mm-dd hh: mm:ss.nnn.

function date_and_time() {var date = new Date();//zero-pad a single zero if neededvar zp = function (val){return (val <= 9 ? '0' + val : '' + val);}
//zero-pad up to two zeroes if neededvar zp2 = function(val){return val <= 99? (val <=9? '00' + val : '0' + val) : ('' + val ) ;}
var d = date.getDate();var m = date.getMonth() + 1;var y = date.getFullYear();var h = date.getHours();var min = date.getMinutes();var s = date.getSeconds();var ms = date.getMilliseconds();return '' + y + '-' + zp(m) + '-' + zp(d) + ' ' + zp(h) + ':' + zp(min) + ':' + zp(s) + '.' + zp2(ms);}

简短的答案

没有javascript所迎合的“通用”留档;每个拥有javascript的浏览器实际上都是一个实现。然而,大多数现代浏览器都倾向于遵循一个标准,那就是EMCAScript标准;ECMAScript标准字符串将最低限度地采用ISO 8601定义的修改实现。

除此之外,浏览器也倾向于遵循IETF提出的第二个标准,即RFC 2822中对时间戳的定义。实际留档可以在底部的参考列表中找到。

从这一点上,你可以期待基本的功能,但是“应该”是什么并不是本质上的“是”是什么。不过,我将在程序上稍微深入一点,因为似乎只有三个人真正回答了这个问题(Scott、goofBallLogic和peller),对我来说,这表明大多数人不知道当你创建Date对象时实际发生了什么。


冗长的答案

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


要回答这个问题,或者通常甚至寻找这个问题的答案,你需要知道javascript并不是一门新颖的语言;它实际上是ECMAScript的实现,并且遵循ECMAScript标准(但请注意,javascript实际上也早于这些标准;EMCAScript标准是建立在LiveScript/JavaScript的早期实现之上的)。当前的ECMAScript标准是5.1(2011);在最初提出这个问题的时候(2009年6月),该标准是3(4被放弃),但是5在2009年底发布后不久就发布了。这应该概述了一个问题;JavaScript实现可能遵循的标准,可能无法反映实际到位的内容,因为a)它是给定标准的实现,b)并非标准的所有实现都是清教徒,c)功能不会与新标准同步发布,因为d)实现是恒定的半成品

从本质上讲,在处理javascript时,您正在处理实现(javascript本身)的派生(特定于浏览器的javascript)。例如,Google的V8实现了ECMAScript 5.0,但Internet Explorer的JScript并不试图符合任何ECMAScript标准,但Internet Explorer 9确实符合ECMAScript 5.0。

当将单个参数传递给new Date()时,它会强制转换此函数原型:

new Date(value)

当两个或多个参数传递给new Date()时,它会强制转换此函数原型:

new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )

这两个函数看起来应该很熟悉,但这并不能立即回答你的问题,什么量化为可接受的“日期格式”需要进一步解释。当您将字符串传递给new Date()时,它将调用原型(注意我松散地使用原型这个词;版本可能是单个函数,也可能是单个函数中条件语句的一部分)新日期(值),并将您的字符串作为“value”参数的参数。此函数将首先检查它是数字还是字符串。此函数的留档可以在这里找到:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2

由此,我们可以推断出,要获得new Date(value)允许的字符串格式,我们必须查看方法Date.parse(string)。该方法的留档可以在这里找到:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2

我们可以进一步推断,日期预计将采用修改后的ISO 8601扩展格式,如下所示:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

然而,我们可以从经验中认识到javascript的Date对象接受其他格式(首先通过这个问题的存在来强制执行),这没关系,因为ECMAScript允许实现特定的格式。然而,这仍然没有回答可用格式上可用的留档问题,也没有回答实际允许的格式。我们将看看Google的javascript实现,V8;请注意,我并不是说这是“最好的”javascript引擎(如何定义“最好”甚至“好”),也不能假设V8中允许的格式代表了今天可用的所有格式,但我认为假设它们确实符合现代期望是公平的。

谷歌的V8,date.js,DateConstructor

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141

查看DateConstructor函数,我们可以推断我们需要找到DateParse函数;但是,请注意,“年”不是实际的年份,只是对“年”参数的引用。

谷歌的V8,date.js,DateParse

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270

这将调用%DateParseString,它实际上是C++函数的运行时函数引用。

Google的V8,runtime.cc%DateParseString

https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559

我们在这个函数中关注的函数调用是针对DateParser::Parse()的;忽略围绕这些函数调用的逻辑,这些只是检查是否符合编码类型(ASCII和UC16)。

Google的V8,dateparser-inl. h,DateParser::Parse

https://code.google.com/p/v8/source/browse/trunk/src/dateparser-inl.h?r=18400#36

这是实际定义它接受的格式的函数。本质上,它检查EMCAScript 5.0 ISO 8601标准,如果它不符合标准,那么它将尝试基于旧格式构建日期。基于注释的几个关键点:

  1. 解析器未知的第一个数字之前的单词将被忽略。
  2. 带括号的文本将被忽略。
  3. 后面跟着“:”的无符号数字被解释为“时间分量”。
  4. 后跟“.”的无符号数字被解释为“时间分量”,并且必须后跟毫秒。
  5. 签名数字后跟小时或小时分钟(例如+5:15或+0515)被解释为时区。
  6. 声明小时和分钟时,可以使用“hh: mm”或“hhmm”。
  7. 表示时区的单词被解释为时区。
  8. 所有其他数字都解释为“日期组件”。
  9. 所有以月份的前三位开头的单词都被解释为月份。
  10. 您可以以两种格式之一定义分钟和小时:“hh: mm”或“hhmm”。
  11. 在处理数字后,不允许使用 “+”, “-“ 和不匹配的“)”等符号。
  12. 匹配多种格式(例如1970-01-01)的项目将作为符合标准的EMCAScript 5.0 ISO 8601字符串进行处理。

因此,这应该足以让您基本了解将字符串传递给Date对象时会发生什么。您可以通过查看Mozilla在Mozilla开发人员网络上指向的以下规范(符合IETF RFC 2822时间戳)来进一步扩展这一点:

https://www.rfc-editor.org/rfc/rfc2822#page-14

Microsoft Developer Network还提到了Date对象的附加标准:ECMA-402,即ECMAScript国际化API规范,它是对ECMAScript 5.1标准(以及未来标准)的补充。可以在这里找到:

http://www.ecma-international.org/ecma-402/1.0/

无论如何,这应该有助于突出显示没有“留档”可以普遍代表javascript的所有实现,但是仍然有足够的留档可用来合理地了解Date对象可以接受哪些字符串。

参考文献

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

https://www.rfc-editor.org/rfc/rfc2822#page-14

http://www.ecma-international.org/ecma-402/1.0/

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270

https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559

https://code.google.com/p/v8/source/browse/trunk/src/dateparser-inl.h?r=18400#36

资源

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

http://msdn.microsoft.com/en-us/library/ff743760(v=vs.94). aspx

请参阅dtmFRM.js。如果您熟悉C#的自定义日期和时间格式字符串,这个库应该做完全相同的事情。

DEMO

var format = new dtmFRM();var now = new Date().getTime();
$('#s2').append(format.ToString(now,"This month is : MMMM") + "</br>");$('#s2').append(format.ToString(now,"Year is  : y or yyyy or yy") + "</br>");$('#s2').append(format.ToString(now,"mm/yyyy/dd") + "</br>");$('#s2').append(format.ToString(now,"dddd, MM yyyy ") + "</br>");$('#s2').append(format.ToString(now,"Time is : hh:mm:ss ampm") + "</br>");$('#s2').append(format.ToString(now,"HH:mm") + "</br>");$('#s2').append(format.ToString(now,"[ddd,MMM,d,dddd]") + "</br></br>");
now = '11/11/2011 10:15:12' ;
$('#s2').append(format.ToString(now,"MM/dd/yyyy hh:mm:ss ampm") + "</br></br>");
now = '40/23/2012'$('#s2').append(format.ToString(now,"Year is  : y or yyyy or yy") + "</br></br>");

我无法找到任何有效日期格式的明确留档,因此我编写了自己的测试,以查看各种浏览器支持的内容。

http://blarg.co.uk/blog/javascript-date-formats

我的结果得出结论,以下格式在我测试的所有浏览器中都有效(示例使用日期“2013年8月9日”):

[全年]/[月份]/[日期编号]-月可以是带或不带前导零的数字,也可以是短格式或长格式的月份名称,日期号可以带或不带前导零。

  • 2013/08/09
  • 2013/08/9
  • 2013/8/09
  • 2013/8/9
  • 2013/8/09
  • 2013/8/9
  • 2013/Aug/09
  • 2013/Aug/9

[月份]/[全年]/[日期]-月可以是带或不带前导零的数字,也可以是短格式或长格式的月份名称,日期号可以带或不带前导零。

  • 08/2013/09
  • 08/2013/9
  • 8/2013/09
  • 8/2013/9
  • 八月/2013/09
  • 8月/2013/9
  • Aug/2013/09
  • 八月/2013/9

以空格分隔的[全年]、[月份名称]和[日期编号]的任意组合-月份名称可以是短格式或长格式,日期编号可以带或不带前导零。

  • 2013年8月09
  • 2013年8月09
  • 2013年8月9日
  • 2013 Aug 09
  • 2013年8月9日
  • 2013年8月9日
  • 等…

也适用于“现代浏览器”(或换句话说,除IE9及以下版本之外的所有浏览器)

[全年]-[月份]-[日期]-月份和日期必须包含前导零(这是MySQL日期类型使用的格式)

  • 2013-08-09

使用月份名称:
有趣的是,当使用月份名称时,我发现只有月份名称的前3个字符被使用过,所以以下所有字符都是完全有效的:

new Date('9 August 2013');new Date('9 Aug 2013');new Date('9 Augu 2013');new Date('9 Augustagfsdgsd 2013');

您可能会发现对date对象的这种修改很有用,它比任何库都小,并且可以轻松扩展以支持不同的格式:

注:

  • 它使用Object.keys(),这在旧的浏览器中是未定义的,因此您可能需要从给定的链接实现Poly填充。

代码

Date.prototype.format = function(format) {// set default format if function argument not providedformat = format || 'YYYY-MM-DD hh:mm';
var zeropad = function(number, length) {number = number.toString();length = length || 2;while(number.length < length)number = '0' + number;return number;},// here you can define your formatsformats = {YYYY: this.getFullYear(),MM: zeropad(this.getMonth() + 1),DD: zeropad(this.getDate()),hh: zeropad(this.getHours()),mm: zeropad(this.getMinutes())},pattern = '(' + Object.keys(formats).join(')|(') + ')';
return format.replace(new RegExp(pattern, 'g'), function(match) {return formats[match];});};

使用

var now = new Date;console.log(now.format());// outputs: 2015-02-09 11:47var yesterday = new Date('2015-02-08');console.log(yesterday.format('hh:mm YYYY/MM/DD'));// outputs: 00:00 2015/02/08

使用此功能

toTimeString() and toLocaleDateString()

更多详情请参考下面的链接https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

我们可以手动完成,它非常直接和简单。

var today = new Date();	   
alert("today :"+today);	   
var dd = today.getDate();alert("dd :"+dd);	   
var mm = today.getMonth()+1; //January is 0!alert("mm :"+mm);	   
var yyyy = today.getFullYear();	   
alert("yyyy :"+yyyy);	   
	   
var hh = today.getHours();	   
alert("hh :"+hh);	   
var min = today.getMinutes();	   
alert("min :"+min);	 	
var ss = today.getSeconds();	 	
alert("ss :"+ss);
if(dd<10) {dd='0'+dd}
if(mm<10) {mm='0'+mm}
//  today = mm+'/'+dd+'/'+yyyy;// if you want / instead - then add /	 
	 
today = yyyy + "-" + mm + "-" + dd + " " + hh + ":" + mm + ":" + ss;today = yyyy + "/" + mm + "/" + dd + " " + hh + ":" + mm + ":" + ss;// use according to your choice 

如果您不需要像Moment.js这样的库提供的所有功能,那么您可以使用我的strftime端口。它是轻量级的(1.35 KB与Moment.js2.15.0相比缩小了57.9 KB),并提供了strftime()的大部分功能。

/* Port of strftime(). Compatibility notes:** %c - formatted string is slightly different* %D - not implemented (use "%m/%d/%y" or "%d/%m/%y")* %e - space is not added* %E - not implemented* %h - not implemented (use "%b")* %k - space is not added* %n - not implemented (use "\n")* %O - not implemented* %r - not implemented (use "%I:%M:%S %p")* %R - not implemented (use "%H:%M")* %t - not implemented (use "\t")* %T - not implemented (use "%H:%M:%S")* %U - not implemented* %W - not implemented* %+ - not implemented* %% - not implemented (use "%")** strftime() reference:* http://man7.org/linux/man-pages/man3/strftime.3.html** Day of year (%j) code based on Joe Orost's answer:* http://stackoverflow.com/questions/8619879/javascript-calculate-the-day-of-the-year-1-366** Week number (%V) code based on Taco van den Broek's prototype:* http://techblog.procurios.nl/k/news/view/33796/14863/calculate-iso-8601-week-and-year-in-javascript.html*/function strftime(sFormat, date) {if (!(date instanceof Date)) date = new Date();var nDay = date.getDay(),nDate = date.getDate(),nMonth = date.getMonth(),nYear = date.getFullYear(),nHour = date.getHours(),aDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],aMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],aDayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],isLeapYear = function() {if (nYear&3!==0) return false;return nYear%100!==0 || year%400===0;},getThursday = function() {var target = new Date(date);target.setDate(nDate - ((nDay+6)%7) + 3);return target;},zeroPad = function(nNum, nPad) {return ('' + (Math.pow(10, nPad) + nNum)).slice(1);};return sFormat.replace(/%[a-z]/gi, function(sMatch) {return {'%a': aDays[nDay].slice(0,3),'%A': aDays[nDay],'%b': aMonths[nMonth].slice(0,3),'%B': aMonths[nMonth],'%c': date.toUTCString(),'%C': Math.floor(nYear/100),'%d': zeroPad(nDate, 2),'%e': nDate,'%F': date.toISOString().slice(0,10),'%G': getThursday().getFullYear(),'%g': ('' + getThursday().getFullYear()).slice(2),'%H': zeroPad(nHour, 2),'%I': zeroPad((nHour+11)%12 + 1, 2),'%j': zeroPad(aDayCount[nMonth] + nDate + ((nMonth>1 && isLeapYear()) ? 1 : 0), 3),'%k': '' + nHour,'%l': (nHour+11)%12 + 1,'%m': zeroPad(nMonth + 1, 2),'%M': zeroPad(date.getMinutes(), 2),'%p': (nHour<12) ? 'AM' : 'PM','%P': (nHour<12) ? 'am' : 'pm','%s': Math.round(date.getTime()/1000),'%S': zeroPad(date.getSeconds(), 2),'%u': nDay || 7,'%V': (function() {var target = getThursday(),n1stThu = target.valueOf();target.setMonth(0, 1);var nJan1 = target.getDay();if (nJan1!==4) target.setMonth(0, 1 + ((4-nJan1)+7)%7);return zeroPad(1 + Math.ceil((n1stThu-target)/604800000), 2);})(),'%w': '' + nDay,'%x': date.toLocaleDateString(),'%X': date.toLocaleTimeString(),'%y': ('' + nYear).slice(2),'%Y': nYear,'%z': date.toTimeString().replace(/.+GMT([+-]\d+).+/, '$1'),'%Z': date.toTimeString().replace(/.+\((.+?)\)$/, '$1')}[sMatch] || sMatch;});}

样品用法:

strftime('%F'); // Returns "2016-09-15"strftime('%A, %B %e, %Y'); // Returns "Thursday, September 15, 2016"
// You can optionally pass it a Date object...
strftime('%x %X', new Date('1/1/2016')); // Returns "1/1/2016 12:00:00 AM"

最新代码可在此处获得:https://github.com/thdoan/strftime

这个问题的具体答案可以在下面的两行中找到:

//pull the last two digits of the yearconsole.log(new Date().getFullYear().toString().substr(2,2));

格式化完整日期时间示例(MMddyy):jsFiddle

JavaScript:

    //A function for formatting a date to MMddyyfunction formatDate(d){//get the monthvar month = d.getMonth();//get the dayvar day = d.getDate();//get the yearvar year = d.getFullYear();    
//pull the last two digits of the yearyear = year.toString().substr(2,2);    
//increment month by 1 since it is 0 indexedmonth = month + 1;//converts month to a stringmonth = month + "";
//if month is 1-9 pad right with a 0 for two digitsif (month.length == 1){month = "0" + month;}
//convert day to stringday = day + "";
//if day is between 1-9 pad right with a 0 for two digitsif (day.length == 1){day = "0" + day;}
//return the string "MMddyy"return month + day + year;}
var d = new Date();console.log(formatDate(d));

d = Date.now();d = new Date(d);d = (d.getMonth()+1)+'/'+d.getDate()+'/'+d.getFullYear()+' '+(d.getHours() > 12 ? d.getHours() - 12 : d.getHours())+':'+d.getMinutes()+' '+(d.getHours() >= 12 ? "PM" : "AM");
console.log(d);

所有浏览器

使用您正在使用的源格式格式化日期的最可靠方法是应用以下步骤:

  1. 使用new Date()创建Date对象
  2. 使用.getDate().getMonth().getFullYear()分别获取日、月和年
  3. 根据您的目标格式将碎片粘贴在一起

示例:

var date = '2015-11-09T10:46:15.097Z';
function format(input) {var date = new Date(input);return [("0" + date.getDate()).slice(-2),("0" + (date.getMonth()+1)).slice(-2),date.getFullYear()].join('/');}
document.body.innerHTML = format(date); // OUTPUT : 09/11/2015

(另见这个小提琴)。


仅限现代浏览器

您还可以使用内置的.toLocaleDateString方法为您进行格式化。您只需要传递正确的语言环境和选项来匹配正确的格式,不幸的是,只有现代浏览器(*)支持这种格式:

var date = '2015-11-09T10:46:15.097Z';
function format(input) {return new Date(input).toLocaleDateString('en-GB', {year: 'numeric',month: '2-digit',day: '2-digit'});}
document.body.innerHTML = format(date); // OUTPUT : 09/11/2015

(另见这个小提琴)。


(*)根据MDN,“现代浏览器”表示Chrome24+,Firefox 29+,IE11,Edge12+,Opera 15+和Safari夜间构建

懒惰的解决方案是使用Date.toLocaleString和正确的区域代码

获取您可以运行的匹配区域列表

#!/bin/bash
[ -f bcp47.json ] || \wget https://raw.githubusercontent.com/pculture/bcp47-json/master/bcp47.json
grep 'tag" : ' bcp47.json | cut -d'"' -f4 >codes.txt
js=$(cat <<'EOF'const fs = require('fs');const d = new Date(2020, 11, 12, 20, 00, 00);fs.readFileSync('codes.txt', 'utf8').split('\n').forEach(code => {try {console.log(code+' '+d.toLocaleString(code))}catch (e) { console.log(code+' '+e.message) }});EOF)
# print THE LIST of civilized countriesecho "$js" | node - | grep '2020-12-12 20:00:00'

这是…名单

af ce eo gv ha ku kw ky lt mg rw se sn sv xh zuksh mgo sah wae AF KW KY LT MG RW SE SN SV

样品使用:

(new Date()).toLocaleString('af')
// -> '2020-12-21 11:50:15'

:)

(注意:这可能不是便携式的。

date-fns是最新的和最伟大的竞争者(比现在更好)

  • 模块化
  • 不可变
  • 国际化
  • 摇树
  • 打字稿支持

此处为留档

你会做这样的事情:

import { format, formatDistance, formatRelative, subDays } from 'date-fns'
format(new Date(), "'Today is a' eeee")//=> "Today is a Tuesday"
formatDistance(subDays(new Date(), 3), new Date(), { addSuffix: true })//=> "3 days ago"
formatRelative(subDays(new Date(), 3), new Date())//=> "last Friday at 7:26 p.m."

几乎所有的现代浏览器现在都支持#0#1,其中options是一个可选的参数来简化格式。

示例:

const event = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
console.log(event.toLocaleDateString(undefined, options));// expected output: Thursday, December 20, 2012 (varies according to default locale)

根据tc39.es/ecma402w3c.org,以下是支持的参数值列表:

地区:

ar-SAbn-BDbn-INcs-CZda-DKde-ATde-CHde-DEel-GRen-AUbn-BD0,bn-BD1,bn-BD2,bn-BD3,bn-BD4,bn-BD5,bn-BD6,bn-BD7,bn-BD8,bn-BD9,bn-IN0,bn-IN1,bn-IN2,bn-IN3,bn-IN4,bn-IN5,bn-IN6,bn-IN7,bn-IN8,bn-IN9,cs-CZ0,cs-CZ1,cs-CZ2,cs-CZ3,cs-CZ4,cs-CZ5,cs-CZ6,cs-CZ7,cs-CZ8,cs-CZ9,da-DK0,da-DK1,da-DK2,da-DK3,da-DK4,da-DK5,da-DK6,da-DK7,da-DK8,da-DK9,de-AT0,de-AT1,de-AT2

选项:

内部槽属性
[[工作日]]"工作日""窄","短","长"
[[时代]]"时代""窄","短","长"
[年份]"年份""2位数","数字"
[[月]]"月份""2位数","数字","窄","短","长"
[日]"天""2位数","数字"
"窄","短","长"
[[小时]]"小时""2位数","数字"
[[分钟]]"分钟""2位数","数字"
[秒]"秒""2位数","数字"
[[小数秒]]1,2,3
[[TimeZoneName]]"timeZoneName""短","长"

对于好奇的人来说,有一个名为tc39/时间的实验特性,目前处于第3阶段提案,它为ECMAScript语言带来了现代日期/时间API。

引用tc39网站:

Date一直是ECMAScript中的一个长期痛点。这是Temporal的提议,Object是一个全局的Object,充当顶级命名空间(如Math),它为ECMAScript语言带来了一个现代的日期/时间API。有关Date的一些问题的详细信息以及Temporal的动机,请参阅:修复JavaScript日期

一本帮助你入门和学习Temporal来龙去脉的食谱是可用的这里

额外资源: