如何解决日期到 UTC 字符串在一天内返回日期但比较返回 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:
但是当我将日期与时刻库进行比较时
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'})
作为语言“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,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)));
附注。强烈建议不要使用内置的解析器,但是因为 ECMAScript 支持时间戳格式,所以我认为这个例子没问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。