日期为 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 进行比较,您可以:
- 转换为时区 +0 中的时间戳并仅比较日期部分,或者
- 将日期的时间值除以一天中的毫秒数并将其取整(因为在 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 支持时间戳格式,我认为这个例子没问题。
我正在尝试使用 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 进行比较,您可以:
- 转换为时区 +0 中的时间戳并仅比较日期部分,或者
- 将日期的时间值除以一天中的毫秒数并将其取整(因为在 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 支持时间戳格式,我认为这个例子没问题。