Javascript 日期因难以处理而臭名昭著。在本教程中,我们将了解 Javascript 日期的工作原理,以及如何根据自己的喜好操作它们。
创建日期#
要创建日期,我们通常使用Date()
函数。例如,要获取当前日期,我们可以执行以下操作:
let date = new Date(): // Console logs the current date. console.log(date); // i.e. Fri Jul 09 2021 20:22:04 GMT+0100 (British Summer Time)
然后一切都基于使用new Date()
. 让我们看看一些典型的用例以及它们如何使用此new Date()
功能。
获取当前时间戳#
unix 时间戳是自1970 年 1 月 1 日以来的秒数。要在 Javascript 中获取 unix 时间戳,我们使用函数getTime()
. 奇怪的是,Javascript 以毫秒为单位给出时间戳——如果你想要以秒为单位,你必须将最后的数字除以 1000。
let date = new Date().getTime(): // Console logs the current time stamp. console.log(date); // i.e. 1625858618210
正如您可能已经猜到的那样,有许多函数可以通过这种方式运行日期函数。让我们再看一些。
获取日、月或年#
以下函数涵盖日、月、年检索:
- new Date().getDay() – 获取从 0 开始计算的星期几Sunday ,因此 Friday 将为5。
- new Date().getDate() – 获取月份的日期,因此 7 月 9 日将返回9。
- new Date().getMonth() – 获取从 0 开始计算的当前月份数,因此 7 月 9 日将返回6。
- new Date().getFullYear() – 获取当前年份的数字,即2021 年。
- new Date().getSeconds() – 获取当前秒数。
- new Date().getMilliseconds() – 获取毫秒计数(从0 – 999)。
- new Date().getMinutes() – 获取当前的分钟数。
- new Date().getHours() – 获取当前小时数。
- new Date().getTimezoneOffset() – 从 0 开始获取时区偏移量,以分钟计算。
Javascript 通常以有限的格式为我们提供日期,因此使用上面的函数,显示一个示例来获取当前时间和日期,并将其放入自定义格式:
let date = new Date(); let day = date.getDate(); let month = date.getMonth(); let year = date.getFullYear(); let hours = date.getHours(); let minutes = date.getMinutes(); let myCustomDateFormat = `${day}-${month}-${year} at ${hours}:${minutes}`;
这些函数都为我们提供了一些收集当前日期和时间的灵活性,但是如果我们想更改已经存在的日期的时间怎么办?让我们看看它是如何工作的:
与获取日期、月份或年份一样,我们也有设置日期和时间的相关函数。您可以通过将上述函数中的单词get替换为set来计算这些函数。
例如,getDay()
变为setDay()。让我们看一个更新日期的年份和小时的示例:
let date = new Date(); console.log(date); // Returns Fri Jul 09 2021 20:37:51 GMT+0100 (British Summer Time) // Now let's update the date date.setFullYear(2016); date.setHours(12); console.log(date); // Returns Fri Jul 09 2016 12:37:51 GMT+0100 (British Summer Time)
转换为标准日期字符串#
最广泛使用的日期格式之一是ISO 8061格式。这种格式看起来像2021-07-09T20:38:49.452Z。要将日期转换为该日期,我们只需使用toISOString()
.
let date = new Date(); let utcDate = date.toISOString(); // Console logs something like 2021-07-09T20:38:49.452Z console.log(utcDate);
本地化格式
你可能知道,不同的国家有不同的日期格式,所以 Javascript 也想支持它们。为此,我们具有三个功能:
- new Date().toLocaleString – 允许我们设置显示时间和日期的格式。
- new Date().toLocaleDateString – 允许我们设置仅显示日期的格式。
- new Date().toLocaleTimeString – 允许我们设置仅显示时间的格式。
此格式有两个可选参数。一种是我们希望使用的格式,它是类似en-US的代码。您可以在此处找到完整列表。第二个是一个对象,它定义日期的不同部分是数字还是长(文本格式)。
下面给出了一个例子,使用toLocaleString
:
let date = new Date(); let localOptions = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', 'minute' : 'numeric' }; let inFrench = date.toLocaleString('fr-FR', localOptions); // Returns vendredi 9 juillet 2021, 21:53 console.log(inFrench);
解析日期#
在 Javascript 中从字符串中解析日期可能特别困难。最简单的方法是使用诸如 之类的函数手动拆分日期String.split()
,然后将其传递给new Date()
函数。您可以将字符串日期直接传递给日期函数,但浏览器的差异使其非常不可靠。
我们先看一个拆分日期和时间的例子:
let stringDate = '950/02/01'; // Let's split our date.. // This will give us [ '950', '02', '01' ] as an array let splitDate = stringDate.split('/'); // And then force each of those splits to a number let year = parseFloat(splitDate[0]); // We subtract 1 from month, since it starts counting from 0. let month = parseFloat(splitDate[1]) - 1; let day = parseFloat(splitDate[2]); // Date has the following format. We don't have to give all the fields, and if we don't // it assumes 0 for time, and 1 for dates. // new Date(year, monthIndex, day, hours, minutes, seconds, milliseconds) // That means we can do ... let newDate = new Date(year, month, day); // This will return something like Sun Mar 01 0950 00:00:00 GMT-0001 (Greenwich Mean Time) console.log(newDate);
虽然日期并不总是那么简单,但我们几乎可以通过拆分成一个数组来实现大多数日期解析。更复杂的拆分可能如下所示:
let timeDate = '01/01/2021 22:34'; // Start by splitting by space, giving us [ '01/01/2021', '22:34' ] let startSplit = timeDate.split(' '); // Then split again, for date, giving us [ '01', '01', '2021' ]; let dateSplit = startSplit[0].split('/'); // Then split for time, giving us [ '22', '34' ]; let timeSplit = startSplit[1].split(':'); // Then parse it all for date... let day = parseFloat(dateSplit[0]); let month = parseFloat(dateSplit[1]); let year = parseFloat(dateSplit[2]); // And for time... let hour = parseFloat(timeSplit[0]); let minute = parseFloat(timeSplit[1]); // Gives us '1-1-2021 22 34' console.log(`${day}-${month}-${year} ${hour} ${minute}`);
如果字符串的格式已知,则Date()函数本身可以对其进行格式化。如前所述,不推荐这样做,但它适用于大多数浏览器的标准字符串,例如时间 ISO 字符串:
let parseDate = new Date('0950-02-01T00:01:15.000Z').getTime(); // returns -32185382325000 console.log(parseDate);
解析函数
Javascript 也有一个解析函数,你可以通过new Date().parse()
. 但是,这与将日期字符串直接传递到 中所做的完全相同new Date()
,就像我们在上面所做的那样。
结论#
您可能已经在本文中注意到,在 Javascript 中实现日期的方式存在很多不一致之处。有些函数从 0 开始计数,有些则不然。有些函数看起来像是重复的,而解析现有日期似乎很难实现。
幸运的是,未来我们将能够使用新兴的Temporal函数,这就简单多了。我们今天不会介绍这些内容,但可以在下面找到指向该内容和其他有用资源的链接: