如何在JavaScript中获取当前日期?

2992

如何在 JavaScript 中获取当前日期?


473
当前时间为:var currentTime = new Date(); - Hendrik
17
请参阅Date对象的文档,其中包含示例。 - Quentin
37
new Date() 返回的是当前的时间,而不是当前的日期。这个区别很重要,如果你要将其与另一个没有时间组件(即在午夜)的日期进行比较。 - Steve Bennett
16
使用 Moment.js,这个库对于开发人员来说是黄金般的存在。 - RBoschini
5
实际上,它返回的是当前日期和时间。JavaScript没有单独表示仅日期或仅时间值的对象,只有包含两者的Date对象。因此,即使问题不太清楚,预期的答案是获取当前系统日期和时间,这正是 new Date() 返回的内容,所以对于最简明的答案+1给@Hendrik。 - Suncat2000
显示剩余6条评论
62个回答

3418
使用new Date()生成一个包含当前日期和时间的新Date对象。

注意:请务必保留原有的HTML标签。

var today = new Date();
var dd = String(today.getDate()).padStart(2, '0');
var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!
var yyyy = today.getFullYear();

today = mm + '/' + dd + '/' + yyyy;
document.write(today);

这将以 mm/dd/yyyy 格式提供今天的日期。

只需将 today = mm +'/'+ dd +'/'+ yyyy; 更改为您希望的任何格式即可。


7
谢谢提供代码。但我还不明白这一行 if(dd<10){dd='0'+dd} 的作用是什么?为什么要判断 <10?根据我的理解,如果日期的字符少于2位数,在日期前面加上一个0。但是为什么是10呢? - imin
23
因为少于2个字符意味着只有1个字符... 而10以下的所有数字(1到9)都只有1个字符,所以我们会有 0102、...、09 - zfm
11
我们如何进入公元999年? - nnnnnn
41
如果你不在北美地区,需要交换月份和日期的位置。 - Mark Micallef
18
新的Date.prototype.toLocaleDateString()方法是一种更灵活的解决方案。它从ECMAScript 5.1开始成为JavaScript的一部分,并且得到了所有现代浏览器的良好支持。[MDN:toLocaleDateString()] (https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString) - Adam Brown
显示剩余8条评论

537

var utc = new Date().toJSON().slice(0,10).replace(/-/g,'/');
document.write(utc);

如果您要重新使用utc变量,例如new Date(utc),请使用replace选项,因为Firefox和Safari不识别带破折号的日期。


7
我不这么认为 :) 看起来非常直接明了! - Varun Natraaj
7
toJSON() 方法返回的是 UTC 日期时间。 - Andy N
1
它返回一个JSON日期时间。toUTCString()返回的是协调世界时日期时间。 - Varun Natraaj
27
它不考虑时区偏移量。在我的测试时间里,我在寻找“现在”,但却得到了“昨天”。https://dev59.com/3mvXa4cB1Zd3GeqPJ4SM - mickmackusa
8
没问题。这是我在这里看到的最干净的方法。在MomentJS中对于“今天,不是现在”的情况效果很好: moment( new Date().toJSON().slice(0, 10) ) - Kyle Hotchkiss
显示剩余8条评论

457

尽可能地缩短。

要获取类似于“2018-08-03”的格式:

let today = new Date().toISOString().slice(0, 10)

console.log(today)

要获得类似于“8/3/2018”的格式:

let today = new Date().toLocaleDateString()

console.log(today)

此外,您可以将locale作为参数传递,例如toLocaleDateString("sr")等。


11
由于时区偏移,这仍然失败了。 - LStarky
你的第二个答案是最好的。 - GC_
请注意,此返回的是UTC+0时区的日期,而非本地日期。 - xji

278

已更新!,请向下滚动

如果您想让最终用户看到简单漂亮的东西... 另外,在下面的第一个版本中修复了一个小后缀问题。现在可以正确返回后缀。

var objToday = new Date(),
 weekday = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'),
 dayOfWeek = weekday[objToday.getDay()],
 domEnder = function() { var a = objToday; if (/1/.test(parseInt((a + "").charAt(0)))) return "th"; a = parseInt((a + "").charAt(1)); return 1 == a ? "st" : 2 == a ? "nd" : 3 == a ? "rd" : "th" }(),
 dayOfMonth = today + ( objToday.getDate() < 10) ? '0' + objToday.getDate() + domEnder : objToday.getDate() + domEnder,
 months = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'),
 curMonth = months[objToday.getMonth()],
 curYear = objToday.getFullYear(),
 curHour = objToday.getHours() > 12 ? objToday.getHours() - 12 : (objToday.getHours() < 10 ? "0" + objToday.getHours() : objToday.getHours()),
 curMinute = objToday.getMinutes() < 10 ? "0" + objToday.getMinutes() : objToday.getMinutes(),
 curSeconds = objToday.getSeconds() < 10 ? "0" + objToday.getSeconds() : objToday.getSeconds(),
 curMeridiem = objToday.getHours() > 12 ? "PM" : "AM";
var today = curHour + ":" + curMinute + "." + curSeconds + curMeridiem + " " + dayOfWeek + " " + dayOfMonth + " of " + curMonth + ", " + curYear;

document.getElementsByTagName('h1')[0].textContent = today;
<h1></h1>

UBBER UPDATE 经过长时间的拖延,我终于将这个项目更新并 上传到了GitHub上,并使用自己一直在使用的最终解决方案进行了更新。它甚至还有一些最后一刻的修改让它更加美妙!如果你正在寻找旧版的 jsFiddle,请查看这里

此次更新提供了两种选择,相对来说仍然很小,尽管不像我的原始答案那么小。如果你想要极小的代码,请使用原始答案。
还请注意:这仍然比 moment.js 更精简。虽然moment.js很好用,但在我看来,它有太多的方式,需要像学习一门语言一样去学习moment.js。我的代码使用与PHP: date相同的常见格式。

快速链接

Flavor 1 new Date().format(String) 这是我的个人喜好。我知道这有些禁忌,但它在Date对象上非常好用。只需要注意可能对Date对象进行的其他修改即可。

//  use as simple as
new Date().format('m-d-Y h:i:s');   //  07-06-2016 06:38:34

Flavor 2 dateFormat(Date, String) 这是一种更加传统的全能方法,具有前面介绍的所有功能,但是需要传入一个日期参数来调用。

//  use as simple as
dateFormat(new Date(), 'm-d-Y h:i:s');  //  07-06-2016 06:38:34

BONUS Flavor (需要jQuery) $.date(Date, String) 这个插件不仅仅包含一个简单的format选项,它扩展了基本的日期对象,并包括像addDays这样的方法。更多信息请参见Git

在这个模块中,格式字符受PHP:date启发。有关完整列表,请参见我的README

此模块还具有更长的预定义格式列表。要使用预定义格式,只需输入其键名。dateFormat(new Date(), 'pretty-a');

  • 'compound'
    • 'commonLogFormat' == 'd/M/Y:G:i:s'
    • 'exif' == 'Y年m月d日 G时i分s秒'
    • 'isoYearWeek' == 'Y\\WW周'
    • 'isoYearWeek2' == 'Y-\\WW周'
    • 'isoYearWeekDay' == 'Y\\WW周j'
    • 'isoYearWeekDay2' == 'Y-\\WW周-j'
    • 'mySQL' == 'Y-m-d h:i:s'
    • 'postgreSQL' == 'Y.z'
    • 'postgreSQL2' == 'Yz'
    • 'soap' == 'Y-m-d\\TH:i:s.u'
    • 'soap2' == 'Y-m-d\\TH:i:s.uP'
    • 'unixTimestamp' == '@U'
    • 'xmlrpc' == 'Ymd\\TG:i:s'
    • 'xmlrpcCompact' == 'Ymd\\tGis'
    • 'wddx' == 'Y-n-j\\TG:i:s'
  • 'constants'
    • 'AMERICAN' == 'F j Y'
    • 'AMERICANSHORT' == 'm/d/Y'
    • 'AMERICANSHORTWTIME' == 'm/d/Y h:i:sA'
    • 'ATOM' == 'Y-m-d\\TH:i:sP'
    • 'COOKIE' == 'l d-M-Y H:i:s T'
    • 'EUROPEAN' == 'j F Y'
    • 'EUROPEANSHORT' == 'd.m.Y'
    • 'EUROPEANSHORTWTIME' == 'd.m.Y H:i:s'
    • 'ISO8601' == 'Y-m-d\\TH:i:sO'
    • 'LEGAL' == 'j F Y'
    • 'RFC822' == 'D d M y H:i:s O'
    • 'RFC850' == 'l d-M-y H:i:s T'
    • 'RFC1036' == 'D d M y H:i:s O'
    • 'RFC1123' == 'D d M Y H:i:s O'
    • 'RFC2822' == 'D d M Y H:i:s O'
    • 'RFC3339' == 'Y-m-d\\TH:i:sP'
    • 'RSS' == 'D d M Y H:i:s O'
    • 'W3C' == 'Y-m-d\\TH:i:sP'
  • 'pretty'
    • 'pretty-a' == 'g:i.sA l jS \\o\\f F Y'
    • 'pretty-b' == 'g:iA l jS \\o\\f F Y'
    • 'pretty-c' == 'n/d/Y g:iA'
    • 'pretty-d' == 'n/d/Y'
    • 'pretty-e' == 'F jS - g:ia'
    • 'pretty-f' == 'g:iA'

正如你所注意到的,可以使用双重\来转义一个字符。



15
@KamranAhmed 在大约2年和40多个赞后,我认为这个努力是值得的。哈哈。自那以后,我个人已经大大扩展了这个类,但由于我认为大多数人会使用其他推荐的js日期插件,所以没有上传它,但我想我应该让它更加“公开”并将其添加到这里。 - SpYk3HH
16
现在,moment.js 是当今你需要使用的工具。 - Christian Stewart
1
上面有一个错别字(我花了一段时间才发现),它在这一行中使用了变量“today”:“dayOfMonth = today +”。 - user1435707
"today + ( objToday.getDate() < 10) ? '0' + objToday.getDate() + domEnder : objToday.getDate() + domEnder" - JavaScript 是一种愚蠢的语言。 - Alex S
现在是中午12点39分,但打印出来的时间是凌晨12点39分。 - phi lo czar

221
如果只需要日期而不需要时间信息,请使用:

var today = new Date();
    today.setHours(0, 0, 0, 0);

document.write(today);


50
这似乎是唯一一个真正回答了问题的答案。其他人都在回答如何将日期格式化为字符串。 - Inrego
1
我同意。其实我本来想写一个类似这个答案的,但是突然弹出了一个小窗口问我是否已经阅读了所有答案。由于我只看了前面的答案,所以我决定检查一下是否有任何正确的答案,而这个答案是第一个正确的答案。 - Lajos Arpad
这将使用UTC设置小时,可能不适用于所有用例。 - McKay
2
我也同意。完美地回答了问题。谢谢。 - JoBaxter

121
尝试这个:

var currentDate = new Date()
var day = currentDate.getDate()
var month = currentDate.getMonth() + 1
var year = currentDate.getFullYear()
document.write("<b>" + day + "/" + month + "/" + year + "</b>")

结果将会如下所示

15/2/2012

68

如果你需要更精细的日期格式控制,我强烈推荐使用momentjs。它是一个很棒的库,大小只有5KB。http://momentjs.com/


7
支持本地化,非常方便。 - Risadinha
现在我们使用date-fns - 它将日期视为不可变对象(Moment会改变日期),速度更快,而且是模块化的(只需导入所需的内容)。 - Freewalker
2
发布momentjs已经有六年了,它变得越来越臃肿。你可能想要查看https://github.com/iamkun/dayjs - 有人形容它为“节食版的momentjs”。API同样简单。 - benjamin.keen

66
var date = new Date().toLocaleDateString("en-US");

此外,您可以使用两个参数调用toLocaleDateString方法:

var date = new Date().toLocaleDateString("en-US", {
    "year": "numeric",
    "month": "numeric"
});

更多关于这种方法的信息请参见MDN


很好,在Chrome上运行。不幸的是,截至2016年4月22日,无法在PhantomJS上运行。 - chris
1
很棒的解决方案,应该排在最前面。new Date().toLocaleDateString("de-de") 对我来说很管用。 - user3772108
如果您需要月份名称而不是数字,请使用 new Date().toLocaleDateString("en-US", { "year": "numeric", "day": "numeric", "month": "long", }); - mikasa

64

您可以使用moment.js:http://momentjs.com/

var m = moment().format("DD/MM/YYYY");

document.write(m);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>


38
仅仅获取当前日期来说,Moment 太过于复杂了。 - Dan Dascalescu
或者使用moment().format("L")来遵循当前的区域设置。 - Dunc
@DanDascalescu 实际上,JavaScript 的 DateTime 基本规范很糟糕。 - Kind Contributor
如果您的项目中已经导入了momentjs,则这是最干净、最简单的答案。 - Adil H. Raza

58

var d = (new Date()).toString().split(' ').splice(1,3).join(' ');

document.write(d)

将其分解为以下步骤:

  1. (new Date()).toString() 返回 "Fri Jun 28 2013 15:30:18 GMT-0700 (PDT)"

  2. (new Date()).toString().split(' ') 将上述字符串按照每个空格进行分割并返回以下数组:["Fri", "Jun", "28", "2013", "15:31:14", "GMT-0700", "(PDT)"]

  3. (new Date()).toString().split(' ').splice(1,3).join(' ') 获取以上数组的第二、三和四个值,使用空格连接它们,返回一个字符串"Jun 28 2013"


2
我需要一个00:00:00的时间,但不想手动重建它;第二步完美地帮我实现了这一点。赞! - panhandel
4
通过这样做,您可以节省一些字节:Date().split(' ').splice(1,3).join(' ') - hyde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接