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


1397

我注意到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()date对象上使用了该方法,令人惊讶的是,它用于将日期格式化为字符串的目的。

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()对象支持的格式说明符的文档在哪里?


164
您的示例实际上并不像您认为的那样起作用
Jason

27
抱歉,在toString中传递格式字符串可在.NET中使用,并且可能在Java中使用,但是正如Jason指出的那样,这实际上不适用于Javascript。
约书亚·卡莫迪

12
人们记住-问题,无论多么规范,都需要保留问题。请不要进行任何将这个问题变成答案的修改,而应完善和维护答案。谢谢:)
蒂姆·波斯特

1
我在此链接中使用了代码msdn.microsoft.com/zh-cn/library/ie/ff743760 (v=vs.94).aspx-(date.toLocaleDateString(“ en-US”));
Khaled Annajar 2014年

如果将来访问此页面的访问者对大多数答案与问题的联系方式感到困惑,我建议阅读问题修订,尤其是(如果与上述内容不同)修订15 @ Eric Muyser-我因缺少无效内容而感到困惑Date#toString用法。
user66001

Answers:


1062

我喜欢使用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);


27
这两个站点都具有限制性许可证。因此,如果您使用该代码(未经许可),则将受到违反。Momentjs(stackoverflow.com/a/10119138/278976)看起来是一种更好的选择,并且是MIT许可证。
Homer6 2012年

4
@peller此答案回答了问题“如何在javascript中格式化日期?” 实际上是问题的标题。在这个问题上,他颇有误导性。而且,就您的观点而言,此答案不涉及使用随机非标准或未提及的库进行字符串格式化。但是问题的这一部分被错误地提出来,因为对该问题的第一条评论指出了这一点。因此,这可以回答真正的问题,但不能回答实际上不存在的格式字符串。
麦凯2012年

3
@麦凯; 那不是问题。我认为您可能误会了卖方的要求,或者在您的推理中感到困惑。
codeinthehole

10
@codeinthehole“用Java格式化日期”是个问题。“直到现在,我给人的印象是JavaScript没有内置的API可以将日期对象格式化为字符串。” 但随后讨论了这种行为,我认为他认为这是JavaScript的本机。在不知道他错误地引用了哪个库的情况下,我认为最好的猜测是他在问一个问题:“如何用javascript格式化日期?” 而且我不认为我在飞跃。
麦凯

5
MM表示01-12,而不是1-12:2013-04-17 => OK 2013-4-17 => BAD
Adrian Maire 2013年

678

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


7
这还在Date对象周围提供了一个装饰器模式,而不是用猴子来打孔核心对象,因此您不太可能在将来遇到冲突。
加布·马丁·丹佩西

120
请停止滥用“轻量级”一词。对于这样的功能,甚至5kb都非常大,按照今天的大小,它已经增加到19kb。
user123444555621 2013年

26
@ Pumbaa80我不同意“对于这样的功能,即使5kb的大小也非常可笑”。您看过文档吗?这是一个非常有用的库,用于处理JS中的日期。我知道,对于单次使用“ D / M / Y”这样的基本格式,拥有大于几个KB的库可能会有点过大,但是几个KB的差异变得可以忽略不计,因此该库提供的易用性。出于几个KB的考虑,可维护的代码是一件好事。如果最小+ 100KB,我同意。
Turnerj 2013年

15
@Tumerj认为它很有用,并不能解决轻量级的问题。两者无关。
JoshJordan 2014年

9
您不能通过卸下引擎来使喷气式飞机更轻便,因为它会变成滑翔机而不是喷气式飞机。轻量级意味着某些东西仅具有执行指定功能所需的功能。恩,这是一个轻量级的解决方案。
苯教

425

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

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

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

看一下jQuery UI datepicker formatDate的示例。


如何告诉它使用当地时间还是祖鲁语?
Ustaman Sangat'3

7
我更喜欢使用这种解决方案,无需任何库即可获取时间:new Date()。toTimeString()。match(/ ^([0-9] {2}:[0-9] {2}:[0-9 ] {2})/)[0]仅供参考
2012年

有没有办法做到这一点。$ .datepicker.formatDate('yy-mm-dd',new Date(“ txtAdvDate” .Val());或类似的东西
Pomster 2012年

@Pomster-是什么让您认为字符串“ txtAdvDate”上具有val方法?您是说$('#txtAdvDate')。val()吗?假设它适合其中一个构造函数(请参阅此处w3schools.com/jsref/jsref_obj_date.asp),那么它将正常工作。
vbullinger 2012年

@Pomster-尝试使用此方法:document.getElementById(id).value = $ .datepicker.formatDate('yy-mm-dd',new Date());
mrrsb 2012年

219

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

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

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

Date我最常使用的对象参考位于w3schools.com网站上(但Google的快速搜索将显示更多可以更好地满足您的需求的对象)。

还要注意,“ 日期对象属性”部分提供了的链接prototype,该链接说明了使用自定义方法扩展Date对象的一些方法。多年来,JavaScript社区一直在争论这是否是最佳做法,我并不主张或反对它,只是指出它的存在。



2
我的回答也试图解决这个问题。我确实相信Firefox或Mozilla浏览器曾经提供过Date.toString()方法,该方法采用了这种格式的字符串。不幸的是,我找不到任何旧文档。它已不再是标准的一部分,并且甚至在Firefox中也似乎不再受任何支持。
水手2013年

214

自定义格式功能:

对于固定格式,只需一个简单的功能即可完成。以下示例生成国际格式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"

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

10
应该接受答案,因为它给出了所需的格式(2000
Danubian Sailor

6
new Date()。toISOString()。slice(0,10)//“ 2015-04-27”
image72 2015年

2
如果没有9月11日的示例,将非常有帮助,这样可以很清楚地表示日和月的位置。
卡尔·阿德勒

1
@abimelex完成。希望现在更加清楚。
阿德里安·梅尔


125

简短答案

没有javascript可以满足的“通用”文档。每个具有javascript的浏览器实际上都是一种实现。但是,大多数现代浏览器都倾向于遵循一个标准,那就是EMCAScript标准。ECMAScript标准字符串至少需要采用ISO 8601定义的修改实现。

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

由此,您可以期待基本功能,但是“应该”本质上不是“是”。不过,我将在此过程中进行更深入的介绍,因为似乎只有三个人实际回答了这个问题(即斯科特,goofballLogic和peller),对我来说,这表明大多数人都不知道当您出现时实际发生了什么创建一个Date对象。


长答案

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


要回答该问题,或者通常甚至寻找该问题的答案,您需要知道javascript不是一种新颖的语言。它实际上是ECMAScript的实现,并且遵循ECMAScript标准(但请注意,javascript实际上也早于这些标准; EMCAScript标准是在LiveScript / JavaScript的早期实现基础上构建的)。当前的ECMAScript标准为5.1(2011);在最初提出问题时('09年6月),标准是3(放弃了4个),但是在2009年底该职位发布后不久发布了5个。javascript实施可能遵循的标准,可能无法反映实际的实施情况,因为a)它是给定标准的实施,b)并非该标准的所有实施都是纯净的,

本质上,在处理javascript时,您正在处理实现(JavaScript本身)的派生类(特定于浏览器的javascript)。以Google的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 ] ] ] ] ] )


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

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

由此,我们可以推断出要获得新的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允许的格式代表了当今可用的所有格式,但是我认为这很公平假设他们确实遵循了现代的期望。

Google的V8,date.js,DateConstructor

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

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

Google的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)。DateParser :: Parse在这里定义:

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时间戳),可以进一步扩展此规范:

http://tools.ietf.org/html/rfc2822#page-14

Microsoft开发人员网络还提到了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/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date

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


92

确保在JavaScript中处理日期时签出Datejs。在toString函数的情况下,它令人印象深刻且有据可查。

编辑:泰勒·福赛斯指出,datejs已过时。我在当前项目中使用了它,但没有任何问题,但是您应该意识到这一点并考虑替代方法。


2
我找不到用毫秒来输入datejs来创建日期的方法。像这样:var dateTime = new Date(); dateTime.setTime(毫秒);
阿内·埃弗森

14
25k?只是约会?哎哟。
Ben Lesh 2013年

13
Datejs是一个过时的库,在大约5年内没有活跃的开发。它们的来源来自Github和Google Code,它们的最新更新日期均为2008年(2013年)。为了您的理智,请使用XDate或Moment.js。
泰勒·福赛斯

3
@TylerForsythe我为此添加了提示/警告。
TimBüthe2013年

2
大声笑日期脚本已过时...
rtpHarry

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

出于我的目的对其进行了一些增强,以支持AM /
PM-

@WHK但我仍然更喜欢moment.js:D
gongzhitaao

捕获月份时遇到问题:new Date((new Date())。format('yyyy-MM-dd'))返回May,但现在是Jun:-/谁在解析字符串中使用时区?
e-info128 2014年

1
@WHK这实际上是一个非常原始的日期解析器。以防万一您不必过多地纠缠日期。如果您确实需要处理各种格式的日期,我建议您使用一个独立的库,例如momentjs。:D
gongzhitaao 2014年

1
@WHK因为console.log(new Date('2014-06-01')) -> May我认为这与时区有关:D
gongzhitaao 2014年

37

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

一些库提供了用于对此进行参数化的例程,其中一些具有广泛的本地化支持。您也可以在dojo.date.locale中检出方法。


5
试图真正回答问题不会赢得很多选票。只需提名一个受欢迎的图书馆,即可看到您的成绩飞起来!!
RobG

30

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

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/


4
我喜欢这门课,但认为它应该是“静态”课。无需多次实例化它。(不需要new DateFmt()
Cheeso

1
Cheeso:如果我想在页面上设置10种不同日期的3种不同格式怎么办?在这种情况下,拥有此格式化程序的三个实例将很有用。这是一个可以避免的完全有效的用例。OP对此进行了正确设计。在构造时还指定格式可以节省重复的代码,以便您每次需要以某种方式对其进行格式化时都可以指定一种格式。
hsanders 2014年

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"

这是跨浏览器吗?和跨语言环境?
Iftah 2013年

是。显示(浏览器用户)本地时区的时间。
约翰·威廉姆斯


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

用法示例:

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

2
替换操作并不是真正有效的方法,因此最好避免使用它。
mrzmyr 2012年

如果我写的话会怎样?console.log(“日期为:” + dateFormat(new Date(),“ DD / MM / YY”)));
hakan

1
这将打印文本“日期为:12/11 / YY”,因为上述内容无法处理两位数的日期。如果需要,可以在return语句之前添加以下内容:format = format.replace("YY", (""+date.getFullYear()).substring(2));。但是,这变得越来越难看-您可能想沿着RegEx路线或类似路线行驶。
Ollie Bennett

1
@mrzmyr您是否真的认为格式化日期会成为性能瓶颈?来吧。
doug65536 2013年

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

1
好的答案,但是我认为您应该将zp2函数更改为:var zp2 = function(val){return val <= 9?'00'+ val:(val <= 99?'0'+ val:''+ val); }
Eric Wang

1
有一个例外,当ms part的值为0时,它是不相同的,在您的函数中,结果为'00',而不是'000'。
Eric Wang

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

采用

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

8

只是为了继续恭敬待议的可靠答案-这可以处理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;
}

很好的解决方案!var a = new Date(); a.format('yyyy-MM-d'); //返回2013-08-16。
Adrian Maire

this.getMonth(); 在iOS中失败
N20084753 2015年

7

我找不到有效日期格式的任何权威性文档,因此我编写了自己的测试以查看各种浏览器支持的功能。

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

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

[Full Year] / [Month] / [Date number] -月可以是带或不带前导零的数字,也可以是短或长格式的月名称,日期可以带或不带前导零。

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

[Month] / [Full Year] / [Date Number] -月可以是带或不带前导零的数字,也可以是短或长格式的月名称,日期可以带或不带前导零。

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

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

  • 2013年8月9日
  • 2013年8月09
  • 2013年8月9日
  • 2013年8月9日
  • 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');

6

在JavaScript中格式化尤其是解析日期可能会有些麻烦。并非所有浏览器都以相同方式处理日期。因此,虽然了解基本方法很有用,但使用帮助程序库更为实用。

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

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


6

示例代码:

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

输出:

“ 13:45:20”


2
值得注意toISOString(); 它输出UTC。因此,如果new Date();// = Fri Nov 22 2013 17:48:22 GMT+0100使用上面的代码,则输出为"16:48:22"
Tewr

6

sugar.js库具有一些出色的功能,可用于处理JavaScript中的日期。并且它有很好的记录

Sugar从Date.create方法开始就为Date类提供了很多帮助,该方法可以使用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"

4

所有浏览器

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

  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的说法,“现代浏览器”是指Chrome 24 +,Firefox 29 +,IE11,Edge12 +,Opera 15+和Safari 每晚构建的版本


3

我写的另一种选择:

DP_DateExtensions库

不确定是否会有所帮助,但是我发现它在几个项目中很有用-看起来它将满足您的需求。

支持日期/时间格式,日期数学(加/减日期部分),日期比较,日期解析等。它是开源的。

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



2

如果你想只显示时间与2位,这可能会帮助你:

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


1

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

1

答案是“无处”,因为日期格式是专有功能。我不认为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");
}

1

如果您不需要像Moment.js这样的库提供的所有功能,那么可以使用我的strftime端口。它轻巧(与Moment.js 2.15.0相比,最小化为1.35 KB与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



0

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

对我来说,使用一个库使用与我已经知道的格式字符串相同的库对我来说更容易,而包含日期功能的所有格式字符串可能性的手册当然可以在php.net上在线获得。

您只需使用首选方法将date.js文件包含在HTML中,然后像这样调用它:

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

如果需要,可以使用d1.getTime()代替valueOf(),它们执行相同的操作。

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


0

许多框架(您可能已经在使用)具有您可能不知道的日期格式。已经提到jQueryUI,但是Kendo UI(全球化)Yahoo UI(Util)AngularJS等其他框架也有它们。

// 11/6/2000
kendo.toString(new Date(value), "d")

// Monday, November 06, 2000
kendo.toString(new Date(2000, 10, 6), "D")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.