Moment isSameOrAfter 计算不正确

问题描述 投票:0回答:2

不确定我是否有正确的参数、语法,或者只是没有正确使用它,但是当使用

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')
javascript jquery datetime momentjs
2个回答
0
投票

我想我已经找到了两种方法来做到这一点,但请告知,我对可以放入该方法中的“天”、“分钟”等参数有点困惑

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
}


0
投票

这是一个时区问题。您的

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>

© www.soinside.com 2019 - 2024. All rights reserved.