矩是相同或不正确计算后

时间:2018-08-27 22:50:46

标签: javascript jquery datetime momentjs

不知道我是否具有正确的参数,语法,或者是完全不能正确使用它,而是在使用“ isSameOrAfter”时,在检查当前utc日期时间是否在日期之后是否返回假时应为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')
};

更新-我想我已解决它,但是请告知这是否是检查当前utc时刻日期时间是否相同或经过1天之后的最好方法

moment().utcOffset((moment().utcOffset() * -1)).isSameOrAfter(oneDayBefore, 'day')

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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实际上对应于第二天00:30 UTC时间。

因此,当您致电

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>