Javascript 日期及其工作原理

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函数,这就简单多了。我们今天不会介绍这些内容,但可以在下面找到指向该内容和其他有用资源的链接: