题 我在哪里可以找到有关格式化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来将日期对象格式化为字符串。

编者注: 以下方法是提问者尝试在特定浏览器上工作但确实如此  一般的工作; 看到这个页面上的答案 看一些实际的解决方案。

今天,我玩了 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() 目的?


1294
2018-06-29 05:46


起源


您的示例实际上并不像您认为的那样工作: jsfiddle.net/edelman/WDNVk/1 - Jason
对不起,在toString中传递格式字符串在.NET中工作,它可以在Java中工作,但正如Jason所指出的,这实际上并不适用于Javascript。 - Joshua Carmody
人们记得 - 问题,无论规范如何, 需要保持问题。请不要进行任何编辑,将此问题转化为答案,改进和维护 答案 代替。谢谢 :) - Tim Post♦
我在这个链接中使用了代码 msdn.microsoft.com/en-us/library/ie/ff743760(v=vs.94).aspx  - (date.toLocaleDateString(“en-US”)); - Khaled Annajar
如果此页面的未来访问者对大多数答案与问题的关系感到困惑,我建议您阅读 问题修订,尤其是(如果与上述不同) 修订版15 @Eric Muyser  - 我对一个人感到困惑的是缺少无效的Date#toString用法。 - user66001


答案:


我爱 使用JavaScript格式化时间和日期的10种方法 和 与日期合作

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

getDate() // Returns the date
getMonth() // Returns the month
getFullYear() // Returns the year

例:

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


1012
2018-04-12 07:18



这两个站点都有限制性许可。因此,如果您使用代码(未经许可),您将违反。 Momentjs(stackoverflow.com/a/10119138/278976)看起来像一个更好的选择,是麻省理工学院的许可证。 - Homer6
@peller这个答案回答了“如何在javascript中格式化日期?”的问题。这实际上是问题的标题。在问题的正文中,他非常误导。而且,就你的观点而言,这个答案并没有谈论使用随机非标准或未提及的库的字符串格式。但问题的这一部分被错误地提出,因为对该问题的第1条评论指出。因此,这回答了真正的问题,而不是实际上不存在的格式字符串。 - McKay
@McKay;那不是问题。我想你要么误解了卖方的要求,要么误解了你的推理。 - codeinthehole
@codeinthehole“在Javascript中格式化日期”是个问题。 “直到现在我的印象是JavaScript没有内置的API来将日期对象格式化为字符串。”但后来讨论了这个行为,我相信他认为这是javascript本地的。在不知道他错误引用哪个库的情况下,我认为最好的猜测是他问的问题是“如何在javascript中设置日期格式?”而且我认为我没有采取疯狂的飞跃。 - McKay
MM表示01-12,而不是1-12:2013-04-17 => OK 2013-4-17 => BAD - Adrian Maire


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缩小+在尽可能小的设置中进行缩放(2014年2月) 


672
2017-08-11 07:27



这也提供了围绕Date对象的装饰器模式,而不是猴子冲压核心对象,因此你不太可能在未来发生冲突。 - Gabe Martin-Dempesy
我不认为我曾经遇到过图书馆 任何 编程语言/环境如此完美地满足其目的。文档也很广泛,非常非常好。真的很高兴找到这个,因为过去的日期一直很难处理(尽管Datejs在某种程度上改善了我的情况)。 - Zac Seth
请停止滥用“轻量级”一词。对于这样的功能来说,甚至5kb也是非常大的,而且就目前而言,这个尺寸已增加到19kb。 - user123444555621
@ Pumbaa80我不同意“即使5kb对于这样的功能也是非常大的”。 你看过博士了吗? 它是一个非常有用的库,用于处理JS中的日期。我知道只要使用像“D / M / Y”这样的基本格式就有一个大于几KB的库可能有点过分,但是几KB的差异可以忽略不计,因为它提供了库提供的易用性。为了几KB,可维护代码是一件好事。如果它是+ 100KB缩小,我会同意。 - Turnerj
@Tumerj认为,解决轻量级问题无关紧要。这两者没有关系。 - JoshJordan


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

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

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

看一下 jQuery UI datepicker formatDate,例子。


419
2017-08-03 16:55



如何告诉它使用当地时间或祖鲁语? - Ustaman Sangat
我更喜欢使用这个解决方案能够获得没有任何库的时间:new Date()。toTimeString()。match(/ ^([0-9] {2}:[0-9] {2}:[0-9 ] {2})/)[0]仅供参考 - markcial
有没有办法做到这一点。 $ .datepicker.formatDate('yy-mm-dd',new Date(“txtAdvDate”.Val());或类似的东西 - Pomster
@Pomster - 你会认为字符串“txtAdvDate”会有一个val方法吗?你的意思是$('#txtAdvDate')。val()?假设它适合其中一个构造函数(请参见此处) w3schools.com/jsref/jsref_obj_date.asp那么那会很好。 - vbullinger
@Pomster - 尝试使用它:document.getElementById(id).value = $ .datepicker.formatDate('yy-mm-dd',new Date()); - mrrsb


哪个文档列出了支持的格式说明符 Date() 目的?

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

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

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

还要注意 日期对象属性 部分提供了一个链接 prototype,它说明了使用自定义方法扩展Date对象的一些方法。有过 一些辩论 在JavaScript社区多年来关于这是否是最佳实践,我并不是在鼓吹或反对它,只是指出它的存在。


216
2018-05-21 12:48



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


自定义格式功能:

对于固定格式,一个简单的功能可以完成工作。以下示例生成国际格式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 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 11 2016 08:00:00 GMT+0100 (W. Europe Standard Time)"

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

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

200
2017-07-02 20:07



应该接受答案,因为它给出了所需的格式(01-01-2000,而不是1-1-2000) - Danubian Sailor
new Date()。toISOString()。slice(0,10)//“2015-04-27” - image72
如果没有9月11日的例子,将会非常有帮助,因此很清楚哪个位置是日期和月份。 - abimelex
@abimelex完成了。希望现在更清楚了。 - Adrian Maire


简答

没有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)

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

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


这两个函数看起来都应该很熟悉,但这并不会立即回答您的问题以及量化为可接受的“日期格式”需要进一步解释。当你将一个字符串传递给新的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


121
2017-11-19 11:31





一定要结帐 Datejs 在JavaScript中处理日期时。这是非常令人印象深刻和有据可查的,因为你可以看到的情况 toString函数

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


91
2017-09-07 03:23



这是一个很棒的图书馆。我已经创建了自己的版本,但是我已经废弃了该项目,转而使用它。谢谢你的链接!!!! (你能告诉我很兴奋) - John Livermore
我找不到用毫秒来提供datejs来创建日期的方法。像这样:var dateTime = new Date(); dateTime.setTime(毫秒); - Arne Evertsson
25K?只为约会?哎哟。 - Ben Lesh
Datejs是一个过时的图书馆,在5年内没有看到积极的发展。它们的来源是Github和Google Code,它们的最新更新日期分别为2008年(2013年)。为了您的理智,请使用XDate或Moment.js。 - Tyler Forsythe
@TylerForsythe我添加了一个提示/警告。 - Tim Büthe