在 JavaScript 中比较没有时间的日期

要比较没有时间的日期。

  1. 创建每个日期的副本。
  2. 使用setUTCHours()方法将复制的日期上的时间设置为午夜。
  3. 比较在这些日期上调用getTime()方法的输出。
const date1 = new Date('2022-01-23T06:55:31.820Z');
const date2 = new Date('2022-01-23T09:30:24.820Z');

const date1WithoutTime = new Date(date1.getTime());
const date2WithoutTime = new Date(date2.getTime());

date1WithoutTime.setUTCHours(0, 0, 0, 0);
date2WithoutTime.setUTCHours(0, 0, 0, 0);

if (date1WithoutTime.getTime() === date2WithoutTime.getTime()) {
  // ✅ This runs 👇️ (dates are the same)
  console.log('dates are the same');
} else {
  console.log('dates are not the same');
}

if (date1WithoutTime.getTime() > date2WithoutTime.getTime()) {
  console.log('date1 comes after date2');
} else if (date1WithoutTime.getTime() === date2WithoutTime.getTime()) {
  // ✅ This runs 👇️ (dates are the same)
  console.log('date1 and date2 are the same');
} else {
  console.log('date2 comes after date1');
}

我们使用Date()构造函数创建了2个 Date 对象,它们都存储了2022年1月23日的时间。

为了能够比较日期而忽略时间,我们必须将日期的时间重置为午夜(或者简单地说是相同的小时、分钟、秒钟和毫秒)。

setUTCHours方法将小时、分钟、秒和毫秒作为参数,并根据世界时间在给定的日期上设置这些值。

然而,setUTCHours方法改变了Date对象,这可能不是你想要的。

这就是为什么我们使用 getTime 方法来获取1970年1月1日00:00:00和给定日期之间经过的毫秒的时间戳。

我们可以将时间戳传递给Date()构造函数来创建一个Date对象的副本。

我们使用setUTCHours方法将日期的时间设置为午夜,这样我们就可以比较日期而忽略时间。

getTime 方法返回一个数字,代表Unix Epoch和给定日期之间经过的毫秒。

console.log(new Date().getTime());

如果我们有两个存储相同年份、月份和日期的日期,那么时间戳将是相等的,因为我们将两个日期的时间设置为午夜。

如果一个日期大于另一个,那么它的时间戳将存储一个更大的数字,因为在Unix Epoch和特定日期之间经过了更多时间。

我们可以比较getTime()的输出,就像我们在JavaScript中比较数字一样。

下面是一个例子,date1 存储的是2022年2月23日的数值,date2存储的是2022年4月27日的数值。

const date1 = new Date('2022-02-23T06:55:31.820Z');
const date2 = new Date('2022-04-27T09:30:24.820Z');

const date1WithoutTime = new Date(date1.getTime());
const date2WithoutTime = new Date(date2.getTime());

date1WithoutTime.setUTCHours(0, 0, 0, 0);
date2WithoutTime.setUTCHours(0, 0, 0, 0);

if (date1WithoutTime.getTime() === date2WithoutTime.getTime()) {
  console.log('dates are the same');
} else {
  // ✅ This runs 👇️ (dates are NOT the same)
  console.log('dates are not the same');
}

if (date1WithoutTime.getTime() > date2WithoutTime.getTime()) {
  console.log('date1 comes after date2');
} else if (date1WithoutTime.getTime() === date2WithoutTime.getTime()) {
  console.log('date1 and date2 are the same');
} else {
  // ✅ This runs 👇️ (date2 comes after date1)
  console.log('date2 comes after date1');
}

date2变量中的值在date1变量中的值之后,因此它的时间戳是一个更大的数字,所以else语句在两个条件中都运行。