Moment js 日期时间对比

IT技术 javascript jquery datetime momentjs
2021-02-01 15:59:09

我正在使用 moment.js 来格式化我的日期时间,这里我有两个日期值,我想在一个日期大于另一个日期时实现特定功能。我阅读了他们的大部分文档,但没有找到实现此目的的功能。我知道它会在那里。

这是我的代码:

var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'
var d = moment(date_time).tz('UTC'); // first date 

var now = new Date(),
    dnow = moment(now).tz('UTC'),
    snow = dnow.minute() % 15,
    diffnow = 15 - snow,
    tonow = moment(dnow).add('minute', diffnow),
    ahead30now = moment(tonow).add('minute', 30);

if (d > ahead30now) {
    // allow input time
    console.log('UTC TIME DB', d.format());
} else {

}

编辑

var date_time = req.body.date + 'T' + req.body.time + req.body.timezone; // 2014-03-24T01:15:000
var utc_input_time = moment(date_time).utc(); // 2014-03-24T01:15:000
console.log('utc converted date_time', moment(date_time).utc().format("YYYY-MM-DDTHH:mm:SSS"));
var isafter = moment(utc_input_time).isAfter(moment('2014-03-24T01:14:000')); // true
if(isafter === true){
    console.log('is after true');
} else {
    console.log('is after is false');
}

在这里,我比较两个日期,即2014-03-24T01:15:000 > 2014-03-24T01:14:000,期望第一个日期大于第二个日期,但它总是进入 else 条件。我不知道为什么?

6个回答

我相信你正在寻找的查询功能isBeforeisSame,和isAfter

但是要确切地说出您正在尝试的内容有点困难。也许您只是想了解输入时间和当前时间之间的差异?如果是这样,请考虑差分函数, diff例如:

moment().diff(date_time, 'minutes')

其他一些事情:

  • 第一行有错误:

      var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'
    

    那是行不通的。我想你的意思是:

      var date_time = '2013-03-24' + 'T' + '10:15:20:12' + 'Z';
    

    当然,你也可以:

      var date_time = '2013-03-24T10:15:20:12Z';
    
  • 您正在使用:.tz('UTC')不正确。 .tz属于moment-timezone除非您使用其他时区,否则您不需要使用它,例如America/Los_Angeles.

    如果要将值解析为 UTC,请使用:

      moment.utc(theStringToParse)
    

    或者,如果要解析本地值并将转换为 UTC,请使用:

      moment(theStringToParse).utc()
    

    或者也许你根本不需要它。仅仅因为输入值是 UTC,并不意味着您必须在整个函数中使用 UTC。

  • 您似乎正在通过 moment(new Date()). 您可以改为使用moment().

更新

根据您的编辑,我认为您可以这样做:

var date_time = req.body.date + 'T' + req.body.time + 'Z';
var isafter = moment(date_time).isAfter('2014-03-24T01:14:00Z');

或者,如果您想确保您的字段被验证为正确格式:

var m = moment.utc(req.body.date + ' ' + req.body.time, "YYYY-MM-DD  HH:mm:ss");
var isvalid = m.isValid();
var isafter = m.isAfter('2014-03-24T01:14:00Z');

您应该能够直接比较它们。

var date = moment("2013-03-24")
var now = moment();

if (now > date) {
   // date is past
} else {
   // date is future
}

@stevemoment().format("DD/MM/YYYY")将返回一个字符串,然后您按字母顺序进行比较,然后 12 月 1 日将在 1 月 2 日之前出现,因为您也以天数领先。format()如果您想直接比较 moment 对象,请不要使用
2021-03-13 15:59:09
我觉得值得解释一下,这是因为 javascript 将对象强制转换为基元,通过Object.prototype.valueOf它在 moment 原型中被覆盖以将纪元时间戳作为数字返回。所以这类似于now.format('x') > date.format('x').
2021-03-23 15:59:09
不,它不起作用......这是我尝试过的。// newDate 高于现在的日期...所以它在大于和小于条件下都打印失败 const resDate = res.url.expiryDate; const newDate = moment(resDate); var now = moment().format("DD/MM/YYYY"); if (now<newDate) { console.log("success"); } else { console.log("失败") }
2021-04-11 15:59:09

jsfiddle:http : //jsfiddle.net/guhokemk/1/

 function compare(dateTimeA, dateTimeB) {
    var momentA = moment(dateTimeA,"DD/MM/YYYY");
    var momentB = moment(dateTimeB,"DD/MM/YYYY");
    if (momentA > momentB) return 1;
    else if (momentA < momentB) return -1;
    else return 0;
}

alert(compare("11/07/2015", "10/07/2015"));

如果 dateTimeA 大于 dateTimeB,该方法返回 1

如果 dateTimeA 等于 dateTimeB,该方法返回 0

如果 dateTimeA 小于 dateTimeB,该方法返回 -1

使用任何momentjs 查询,日期时间采用正确的ISO 格式很重要, , , ,isBeforeisAfterisSameOrBeforeisSameOrAfterisBetween

所以不是 2014-03-24T01:14:000,你的日期时间应该是:

2014-03-24T01:14:002014-03-24T01:14:00.000Z

否则,您可能会收到以下弃用警告,并且条件将评估为 false:

弃用警告:提供的值不是公认的 RFC2822 或 ISO 格式。moment 构造回退到 js Date(),它在所有浏览器和版本中都不可靠。不鼓励使用非 RFC2822/ISO 日期格式,并将在即将发布的主要版本中删除。请参阅 http://momentjs.com/guides/#/warnings/js-date/了解更多信息。

// https://momentjs.com/docs/#/query/

const dateIsAfter = moment('2014-03-24T01:15:00.000Z').isAfter(moment('2014-03-24T01:14:00.000Z'));

const dateIsSame = moment('2014-03-24T01:15:00.000Z').isSame(moment('2014-03-24T01:14:00.000Z'));

const dateIsBefore = moment('2014-03-24T01:15:00.000Z').isBefore(moment('2014-03-24T01:14:00.000Z'));

console.log(`Date is After: ${dateIsAfter}`);
console.log(`Date is Same: ${dateIsSame}`);
console.log(`Date is Before: ${dateIsBefore}`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.0/moment.min.js"
></script>

对于日期时间比较,您可以使用valueOf提供日期时间毫秒的时刻函数,最适合比较:

const date1 = moment('01-02-2020', 'DD-MM-YYYY').valueOf()
const date2 = moment('11-11-2012', 'DD-MM-YYYY').valueOf()

// console.log((date1 > date2 ? 'date1' : 'date2') + " is greater..."  )

if (date1 > date2) {
  console.log("date1 is greater...")
} else {
  console.log("date2 is greater...")
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>