我在哪里可以找到有关在JavaScript中格式化日期的文档?

Nag*_*ran 1381 javascript datetime date date-format time-format

我注意到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")
Run Code Online (Sandbox Code Playgroud)

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

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

编者注:以下方法是提问者的企图,关于特定浏览器的工作,但也不会在一般的工作; 请参阅此页面上的答案以查看一些实际解决方案.

今天,我在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
Run Code Online (Sandbox Code Playgroud)

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

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

Hai*_*vgi 1054

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

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

getDate() // Returns the date
getMonth() // Returns the month
getFullYear() // Returns the year
Run Code Online (Sandbox Code Playgroud)

例:

var d = new Date();
var curr_date = d.getDate();
var curr_month = d.getMonth() + 1; //Months are zero based
var curr_year = d.getFullYear();
console.log(curr_date + "-" + curr_month + "-" + curr_year);
Run Code Online (Sandbox Code Playgroud)

  • 这两个网站都有限制性许可.因此,如果您使用该代码(未经许可),您将违反.Momentjs(http://stackoverflow.com/a/10119138/278976)看起来是一种更好的选择,并且是麻省理工学院的许可证. (26认同)
  • @codeinthehole"在Javascript中格式化日期"是个问题."直到现在我的印象是JavaScript没有内置的API来将日期对象格式化为字符串." 但后来讨论了这种行为,我相信他认为这是javascript本地的.在不知道他错误引用哪个库的情况下,我认为最好的猜测是他问的问题是"如何在javascript中设置日期格式?" 而且我认为我没有采取疯狂的飞跃. (10认同)
  • MM表示01-12,而不是1-12:2013-04-17 => OK 2013-4-17 => BAD (5认同)
  • @peller这个答案回答了"如何在javascript中格式化日期?"的问题.这实际上是问题的标题.在问题的正文中,他非常误导.而且,就你的观点而言,这个答案并没有谈到使用随机非标准或未提及的库的字符串格式.但问题的这一部分被错误地提出,因为问题的第一条评论指出.因此,这回答了真正的问题,而不是实际上不存在的格式字符串. (4认同)
  • @McKay; 那不是问题.我想你要么误解了出纳员的要求,要么误解了你的推理. (3认同)
  • @mcKay; 嗨,谢谢你解释你的推理.我认为提交问题的人在询问他/她可以在哪里找到有关语法正确的各种日期格式化字符串的信息.海报似乎知道_how_格式化日期 - 但不知道如何派生格式化字符串的语法. (2认同)
  • 重要:不要忘记做`d.getMonth() + 1` 因为一些白痴程序员曾经决定日期应该从零开始 (2认同)
  • @nathan 没有人可以声称拥有简单的 JavaScript 语句。从技术上讲,这并不违法。 (2认同)

chx*_*007 677

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"
Run Code Online (Sandbox Code Playgroud)

(*)轻量级含义9.3KB缩小+在尽可能小的设置中进行缩放(2014年2月)

  • 请停止滥用"轻量级"一词.对于这样的功能来说,即使是5kb也是非常大的,并且按照今天的规模增加到19kb. (113认同)
  • @ Pumbaa80我不同意"即使5kb对于这样的功能也是非常大的".[你看过文档了吗?](http://momentjs.com/docs/)这是一个非常有用的库来处理JS中的日期.我知道有一个大于几KB的库,只需使用一个像"D/M/Y"这样的基本格式就可能有点过分,但是几KB的差异对于库提供的易用性来说可以忽略不计.为了几KB,可维护代码是一件好事.如果它是+ 100KB缩小,我会同意. (26认同)
  • @Tumerj认为,解决轻量级问题无关紧要.这两者没有关系. (14认同)
  • 你不能通过拆卸发动机使喷气式飞机更轻巧,因为它变成了滑翔机,而不是喷气式飞机.轻量级意味着某些东西只具有执行指定功能所必需的功能.Ergo,这是一个轻量级的解决方案. (9认同)
  • 这也提供了围绕Date对象的装饰器模式,而不是猴子冲压核心对象,因此您不太可能在未来发生冲突. (7认同)
  • 我认为我没有遇到任何*编程语言/环境中的库,它完全符合其目的.文档也很广泛,非常非常好.真的很高兴找到这个,因为过去的日期一直很难处理(尽管Datejs在某种程度上改善了我的情况). (4认同)
  • "轻量级"是相对的.根据1984年的标准,即使是5KB也不轻巧.:/ (2认同)
  • @ Pumbaa80文件大小无关紧要.虽然'use datejs'是OP问题的解决方案,但实际上并没有回答这个问题.OP没有学到任何不幸,因为实际答案非常简单.因为'使用jQuery'风格的答案,所以很糟糕. (2认同)

小智 425

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

$.datepicker.formatDate('yy-mm-dd', new Date(2007, 1 - 1, 26));
Run Code Online (Sandbox Code Playgroud)

但是,datepicker只格式化日期,不能格式化时间.

看一下jQuery UI datepicker formatDate的例子.

  • 我更喜欢使用这个解决方案能够获得没有任何库的时间:new Date().toTimeString().match(/ ^([0-9] {2}:[0-9] {2}:[0-9 ] {2})/)[0]仅供参考 (7认同)

Sco*_*fen 219

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

今天我偶然发现了这一点,并且很惊讶没有人花时间回答这个简单的问题.没错,有很多库可以帮助进行日期操作.有些人比其他人好.但这不是问题.

AFAIK,纯JavaScript不支持格式说明符,就像您表示要使用它们一样.但它支持的方法格式化日期和/或时间,如.toLocaleDateString(),.toLocaleTimeString().toUTCString().

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

另请注意," 日期对象属性"部分提供了一个链接prototype,其中说明了使用自定义方法扩展Date对象的一些方法.多年来,JavaScript社区一直在争论这是否是最佳实践,我并不是在鼓吹或反对它,只是指出它的存在.

  • MDN也是一个很好的参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date (26认同)
  • 我的回答也试图解决这个问题.我相信Firefox或Mozilla浏览器曾经提供过Date.toString()方法,它采用了这样的格式化字符串.不幸的是,我找不到旧文档的痕迹.它不再是标准的一部分,似乎不再支持任何地方,即使在Firefox中也是如此. (2认同)

Adr*_*ire 212

自定义格式功能:

对于固定格式,一个简单的功能可以完成工作.以下示例生成国际格式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);
}
Run Code Online (Sandbox Code Playgroud)

注意:然而,扩展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"
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

toLocaleDateString:依赖于实现,以区域设置格式的日期.

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

new Date().toLocaleDateString(); // e.g. "21/11/2016"
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

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)"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 应该接受答案,因为它给出了所需的格式(01-01-2000,而不是1-1-2000) (10认同)
  • new Date().toISOString().slice(0,10)//"2015-04-27" (6认同)
  • 如果没有9月11日的例子,将会非常有帮助,因此很清楚哪个位置是日期和月份. (2认同)

小智 125

简答

没有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被放弃),但是在2009年底之后不久发布了5个.这应该概述一个问题; javascript实现可能遵循什么标准,可能无法反映实际存在的内容,因为a)它是给定标准的实现,b)并非标准的所有实现都是清教徒,并且c)功能不是与a同步发布的新标准d)实施是一项持续不断的工作

从本质上讲,当处理javascript时,你正在处理一个实现的衍生物(特定于浏览器的javascript)(javascript本身).例如,谷歌的V8实现了ECMAScript 5.0,但是Internet Explorer的JScript不会尝试符合任何ECMAScript标准,但Internet Explorer 9确实符合ECMAScript 5.0.

当一个参数传递给新的Date()时,它会转换这个函数原型:

new Date(value)
Run Code Online (Sandbox Code Playgroud)

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

new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )
Run Code Online (Sandbox Code Playgroud)


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

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

由此,我们可以推断出为了获得新Date(值)允许的字符串格式,我们必须查看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++函数的运行时函数引用.它指的是以下代码:

谷歌的V8,runtime.cc,%DateParseString

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

我们在这个函数中关注的函数调用是DateParser :: Parse(); 忽略那些函数调用周围的逻辑,这些只是检查符合编码类型(ASCII和UC16).DateParser :: Parse在这里定义:

谷歌的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时间戳)来进一步扩展这一点:

http://tools.ietf.org/html/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对象可接受的字符串.当你想到它时,这个问题很多,是吗?:P

参考

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

http://tools.ietf.org/html/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


Tim*_*the 92

确保在处理JavaScript中的日期时签出Datejs.在toString函数的情况下,您可以看到它非常令人印象深刻并且有详细记录.

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

  • 25K?只为约会?哎哟. (14认同)
  • Datejs是一个过时的图书馆,在5年内没有看到积极的发展.它们的来源是Github和Google Code,它们的最新更新日期分别为2008年(2013年).为了您的理智,请使用XDate或Moment.js. (13认同)
  • @TylerForsythe我添加了一个提示/警告. (3认同)
  • 我找不到用毫秒来提供datejs来创建日期的方法.像这样:var dateTime = new Date(); dateTime.setTime(毫秒); (2认同)
  • 大声笑日期脚本已过期... (2认同)

gon*_*aao 69

您可以Date使用meizzformat所指出的新方法扩展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"));
Run Code Online (Sandbox Code Playgroud)


pel*_*ler 37

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

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

  • 试图真正回答这个问题不会得到很多选票.只需提名一个受欢迎的图书馆,看看你的分数飞! (5认同)

Lyn*_*n S 30

我制作了这个非常简单的格式化程序,它是cut/n/pastable(更新为neater版本):

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())
Run Code Online (Sandbox Code Playgroud)

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

  • 我喜欢这个课程,但认为它应该是一个"静态"课程.无需多次实例化它.(不应该需要`new DateFmt()`) (4认同)

Joh*_*ams 29

框架免费,有限但轻松

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"
Run Code Online (Sandbox Code Playgroud)


Eri*_*lin 22

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


Oll*_*ett 18

通过查看其他答案中提供的几个选项,我决定编写自己有限但简单的解决方案,其他人也可能觉得有用.

/**
* 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;
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

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

  • 替换操作并不是真正有效的,所以防止它是更好的做法. (2认同)

Car*_*arl 11

这是我经常使用的一个功能.结果是yyyy-mm-dd hh:mm:ss.nnn.

function date_and_time() {
    var date = new Date();
    //zero-pad a single zero if needed
    var zp = function (val){
        return (val <= 9 ? '0' + val : '' + val);
    }

    //zero-pad up to two zeroes if needed
    var 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);
}
Run Code Online (Sandbox Code Playgroud)


Vac*_*tny 9

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

注意:

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

Date.prototype.format = function(format) {
    // set default format if function argument not provided
    format = 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 formats
        formats = {
            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];
    });
};
Run Code Online (Sandbox Code Playgroud)

使用

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


小智 8

只是为了继续gongzhitaao的坚实答案 - 这处理上午/下午

 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;
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*ham 7

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

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

我的结果总结了以下格式在我测试的所有浏览器中都有效(示例使用日期"2013年8月9日"):

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

  • 2013年8月9日
  • 2013年8月9日
  • 2013年8月9日
  • 2013年8月9日
  • 2013/8/09
  • 2013/8/9
  • 2013/8/09
  • 2013/8/9

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

  • 08/2013/09
  • 08/2013/9
  • 8/2013/09
  • 8/2013/9
  • 八月/ 2013/09
  • 八月/9分之2013
  • 八月/ 2013/09
  • 八月/9分之2013

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

  • 2013年8月09日
  • 2013年8月09日
  • 2013年8月9日
  • 2013年8月9日
  • 2013年8月9日
  • 2013年8月9日
  • 等等...

也适用于"现代浏览器"(或者换句话说除了IE9及以下版本的所有浏览器)

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

  • 2013年8月9日

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

new Date('9 August 2013');
new Date('9 Aug 2013');
new Date('9 Augu 2013');
new Date('9 Augustagfsdgsd 2013');
Run Code Online (Sandbox Code Playgroud)


小智 6

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

JavaScript库XDate亚当·肖已经出现了自2011年中期,并仍在积极发展.它具有出色的文档,出色的API,格式化,尝试保持向后兼容,甚至支持本地化字符串.

链接到更改区域设置字符串:https://gist.github.com/1221376


and*_*rsh 6

糖.js具有一些很好的功能,可用于处理JavaScript中的日期.而且它有很好的记录.

Sugar为Date类提供了很多热爱,从Date.create方法开始,该方法可以理解15种主要语言中的任何格式的日期,包括"1小时前"等相对格式.日期也可以使用易于理解的语法以任何格式或语言输出,并使用常用日期格式的快捷方式.复杂的日期比较也可以使用像is这样的方法,它可以理解任何格式并应用内置的精度.

几个例子:

Date.create('July 4, 1776')  -> July 4, 1776
Date.create(-446806800000)   -> November 5, 1955
Date.create(1776, 6, 4)      -> July 4, 1776
Date.create('1776?07?04?', 'ja') -> July 4, 1776
Date.utc.create('July 4, 1776', 'en')  -> July 4, 1776

Date.create().format('{Weekday} {d} {Month}, {yyyy}')    -> Monday July 4, 2003
Date.create().format('{hh}:{mm}')                        -> 15:57
Date.create().format('{12hr}:{mm}{tt}')                  -> 3:57pm
Date.create().format(Date.ISO8601_DATETIME)              -> 2011-07-05 12:24:55.528Z

Date.create().is('the 7th of June') -> false
Date.create().addMonths(2); ->"Sunday, June 15, 2014 13:39"
Run Code Online (Sandbox Code Playgroud)


Ner*_* Jr 6

示例代码:

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

输出:

"十三点45分二十秒"

  • 值得注意的是toISOString(); 它输出UTC.因此,如果`new Date(); // = 2013年11月22日星期五17:48:22 GMT + 0100`,带有上述代码的输出将为"16:48:22" (2认同)

Joh*_*ers 5

所有浏览器

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

  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
Run Code Online (Sandbox Code Playgroud)

(另见小提琴).


仅限现代浏览器

您还可以使用内置.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
Run Code Online (Sandbox Code Playgroud)

(另见小提琴).


(*) 根据MDN,"现代浏览器"意味着Chrome 24 +,Firefox 29 +,IE11,Edge12 +,Opera 15+和Safari 夜间构建