日期为 UTC 字符串 return 一天内的日期但比较 return false

Date to UTC string return date in one day but comparison return false

我正在尝试使用 toUTCString() 方法将这些日期转换为 UTC 字符串!

const date1 = "2000-01-01T00:00:00Z";
const date2 = "2000-01-01T11:15:02Z";

结果是

 Sat, 01 Jan 2000 11:15:02 GMT 
 Sat, 01 Jan 2000 00:00:00 GMT:

但是当我将日期与 moment 库进行比较时

function isSameDay(date1, date2) {
  let d1 = new Date(date1);
  let d2 = new Date(date2);
  return moment(d1).isSame(moment(d2), "day");
}

let date1 = "2000-01-01T00:00:00Z";
let date2 = "2000-01-01T11:15:02Z";

console.log(isSameDay(date1, date2));
<script src="https://unpkg.com/moment@2.27.0/moment.js"></script>

我收到了 false - 任何人都可以指导我为什么会这样吗?我知道在当地时间,当我将它们转换为 String() 时,它们处于不同的日期。

本地使用 toString() 方法

Sat Jan 01 2000 06:15:02 GMT-0500 (Eastern Standard Time)
Fri Dec 31 1999 19:00:00 GMT-0500 (Eastern Standard Time)

谢谢

如您所见,moment.js 比较本地日期(这可能是最常见的要求)。要与 UTC 进行比较,您可以:

  1. 转换为时区 +0 中的时间戳并仅比较日期部分,或者
  2. 将日期的时间值除以一天中的毫秒数并将其取整(因为在 ECMAScript 中,UTC 天始终正好是 8.64e7 毫秒)

选项 1

如果您从 Date 对象开始,您可以这样做:

date1.toLocaleDateString('en-ca',{timeZone:'UTC'}) == date2.toLocaleDateString('en-ca',{timeZone:'UTC'})

as language "en-ca" 生成格式为 YYYY-MM-DD 的日期(您可能使用任何语言,但 ISO 8601 格式似乎合适)。重要的部分是timezone: 'UTC'

另一个选项是 toISOString 的日期部分:

date1.toISOString().substring(0,10) == date2.toISOString().substring(0,10)

如果您真的想使用 moment.js,请使用它将日期格式化为 UTC 时间戳:

/** Return true if date1 and date2 are same UTC day
  *
  * @param {Date} date1
  * @param {Date} date2
  * @returns {boolean} true if dates match, false otherwise
  */
function isSameUTCDay(date1, date2) {
  let format = 'YYYY-MM-DD';
  let d1 = moment(date1).utc();
  let d2 = moment(date2).utc();
  return d1.format(format) == d2.format(format);
}

// Same UTC day but different local day anywhere but UTC +0
let date1 = "2000-01-01T00:00:00Z";
let date2 = "2000-01-01T23:59:59Z";

console.log(isSameUTCDay(date1, date2));
<script src="https://unpkg.com/moment@2.27.0/moment.js"></script>

选项 2

作为时间值进行比较:

/** Return true if the UTC date for date1 and date2 are the same
  *
  * @param {Date} date1
  * @param {Date} date2
  * @returns {boolean} true if dates match, false otherwise
  */
function isSameUTCDay(date1, date2) {
  return Math.floor(+date1 / 8.64e7) == Math.floor(+date2 / 8.64e7);
}

// Same UTC day but different local day anywhere but UTC +0
let date1 = "2000-01-01T00:00:00Z";
let date2 = "2000-01-01T23:59:59Z";

// Should be true everywhere
console.log(isSameUTCDay(new Date(date1), new Date(date2)));

PS。强烈建议不要使用内置的解析器,但是由于 ECMAScript 支持时间戳格式,我认为这个例子没问题。