时刻js日期时间比较

Dib*_*ish 338 javascript jquery datetime momentjs

我正在使用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 {

}
Run Code Online (Sandbox Code Playgroud)

编辑

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');
}
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*int 488

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

但要确切地说出你在尝试什么是有点困难的.也许您只是希望得到输入时间和当前时间之间的差异?如果是这样,考虑差异功能,diff.例如:

moment().diff(date_time, 'minutes')
Run Code Online (Sandbox Code Playgroud)

其他一些事情:

更新

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

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

或者,如果您希望确保您的字段经过验证,格式正确:

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');
Run Code Online (Sandbox Code Playgroud)

  • 查看更新的答案.还要观察秒字段中的位数.并且`req.body.timezone`除了'Z`之外还有什么?如果是这样,什么? (3认同)

rya*_*ter 205

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

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

if (now > date) {
   // date is past
} else {
   // date is future
}
Run Code Online (Sandbox Code Playgroud)

$(document).ready(function() {
  
  $('.compare').click(function(e) {
  
    var date = $('#date').val();
  
    var now = moment();
    var then = moment(date);
  
    if (now > then) {
      $('.result').text('Date is past');
    } else {
      $('.result').text('Date is future');
    }

  });

});
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.3/moment.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>



<input type="text" name="date" id="date" value="2014-12-18"  placeholder="yyyy-mm-dd">
<button class="compare">Compare date to current date</button>
<br>
<div class="result"></div>
Run Code Online (Sandbox Code Playgroud)

  • 我觉得值得解释的是,这是有效的,因为javascript通过`Object.prototype.valueOf`将对象强制转换为基元,在当前原型中将其覆盖,以便将纪元时间戳作为数字返回.所以这类似于`now.format('x')> date.format('x')`. (73认同)
  • @steve`moment()。format(“ DD / MM / YYYY”)`将返回一个字符串,然后您按字母顺序进行比较,然后12月1日将在1月2日之前,因为您也要以天数开头。如果您想直接比较目标对象,则不要使用`format()`。 (3认同)

Raz*_*aul 24

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"));
Run Code Online (Sandbox Code Playgroud)

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

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

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


JSO*_*C11 16

重要的是,你的日期时间处于正确的ISO格式使用任何的时候momentjs查询:isBefore,isAfter,isSameOrBefore,isSameOrAfter,isBetween

因此,而不是2014-03-24T01:14:000,您的日期时间应该是:

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

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

弃用警告:提供的值不是公认的RFC2822或ISO格式.时刻构造回落到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}`);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.0/moment.min.js"
></script>
Run Code Online (Sandbox Code Playgroud)


小智 10

var startDate = moment(startDateVal, "DD.MM.YYYY");//Date format
var endDate = moment(endDateVal, "DD.MM.YYYY");

var isAfter = moment(startDate).isAfter(endDate);

if (isAfter) {
    window.showErrorMessage("Error Message");
    $(elements.endDate).focus();
    return false;
}
Run Code Online (Sandbox Code Playgroud)


小智 9

将日期传递给这样的时刻它会比较并给出结果.如果你不想格式删除它

moment(Date1).format("YYYY-MM-DD") > moment(Date2).format("YYYY-MM-DD")
Run Code Online (Sandbox Code Playgroud)

  • `小心`这不过是比较两个字符串 (3认同)

小智 8

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

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

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

if (date1 > date2) {
   alert("date1 is greater..." )
} else {
   alert("date2 is greater..." )
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
Run Code Online (Sandbox Code Playgroud)


TV-*_*-15 5

moment(d).isAfter(ahead30now); // true
Run Code Online (Sandbox Code Playgroud)

http://momentjs.com/docs/#/query/is-after/

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

}
Run Code Online (Sandbox Code Playgroud)