不确定我是否有正确的参数、语法,或者只是没有正确使用它,但是当使用
isSameOrAfter
检查当前 utc 日期时间是否在日期之后返回 false 时,它应该是 true。
var utcDateTime = "8/28/2018 7:30:00 PM";
var oneDayBefore = moment(utcDateTime, "M/D/YYYY h:mm:ss A").subtract(1, 'days');
// oneDayBefore should now be 8/27/2018 7:30:00 PM
if (moment().utc().isSameOrAfter(oneDayBefore, 'day')) {
alert('is same or after')
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment.min.js"></script>
更新
我想我已经修复了它,但是请告知这是否是最好的方法 检查当前 utc 时刻日期时间是否相同或晚于 我已经通过的一个 - 1 天
moment().utcOffset((moment().utcOffset() * -1)).isSameOrAfter(oneDayBefore, 'day')
我想我已经找到了两种方法来做到这一点,但请告知,我对可以放入该方法中的“天”、“分钟”等参数有点困惑
var utcDateTime = "8/28/2018 7:30:00 PM";
var oneDayBefore = moment(utcDateTime, "M/D/YYYY h:mm:ss A").subtract(1, 'days');
var currentUtcMoment = moment().utc().format("M/D/YYYY h:mm:ss A");
if (moment(currentUtcMoment).isSameOrAfter(oneDayBefore, 'day')) {
// do something
}
或
var utcDateTime = "8/28/2018 7:30:00 PM";
var oneDayBefore = moment(utcDateTime, "M/D/YYYY h:mm:ss A").subtract(1, 'days');
var currentUtcMoment = moment().utc().format("M/D/YYYY h:mm:ss A");
if (moment().utcOffset((moment().utcOffset() * -1)).isSameOrAfter(oneDayBefore, 'day')) {
// do something
}
这是一个时区问题。您的
oneDayBefore
正在使用默认的本地时区:
var oneDayBefore = moment(utcDateTime, "M/D/YYYY h:mm:ss A").subtract(1, 'days');
而您将其与使用 UTC 进行比较的那一刻:
moment().utc().isSameOrAfter(oneDayBefore, 'day')
// ^^^^^^
如果你检查每一项的
.format()
,问题就会更清楚。例如,在我的时区 (CST),我看到:
const utcDateTime = "8/28/2018 7:30:00 PM";
const oneDayBefore = moment(utcDateTime, "M/D/YYYY h:mm:ss A").subtract(1, 'days');
console.log(oneDayBefore.format());
// 2018-08-27T19:30:00-05:00
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
在我的时区,UTC 午夜为当地时间 19:00。因此,当地时间 19:30 实际上对应于 第二天 UTC 时间 00:30。
因此,当你打电话时
moment().utc().isSameOrAfter
即将当前 UTC 时间/天与您的
"8/28 7:30:00 PM"
减去一天对应于 当地时间 的任何时间进行比较。但是,当地时间 8 月 27 日 7:30 PM 可能是 UTC 时间的 8 月 28 日 - 因此,您将 moment().utc()
(在撰写本文时,8 月 27 日 23:45)与 8 月 28 日 00:30 (或类似的东西 - 这取决于您的时区)。
最好尽可能在内部使用 UTC 时间,并且仅在需要向用户显示时才对其进行格式化。也就是说,而不是打电话
moment(utcDateTime...
致电
moment.UTC(utcDateTime...
结果将如预期:
const utcDateTime = "8/28/2018 7:30:00 PM";
const oneDayBefore = moment.utc(utcDateTime, "M/D/YYYY h:mm:ss A").subtract(1, 'days');
// ^^^^
console.log(oneDayBefore.format());
const now = moment.utc();
console.log(now.format());
console.log(now.isSameOrAfter(oneDayBefore, 'day'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>