[英]Moment js date time comparison
我正在使用 moment.js 来格式化我的日期时间,这里我有两个日期值,我想在一个日期大于另一个日期时实现特定的 function。 我阅读了他们的大部分文档,但没有找到 function 来实现这一点。 我知道它会在那里。
这是我的代码:
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 条件。 我不知道为什么?
我相信您正在寻找查询函数isBefore
、 isSame
和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())
获取“now”实例。 您可以改为使用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
}
$(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'); } }); });
<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>
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 格式很重要: isBefore
、 isAfter
、 isSameOrBefore
、 isSameOrAfter
、 isBetween
所以不是 2014-03-24T01:14:000,你的日期时间应该是:
2014-03-24T01:14:00或2014-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>
moment(d).isAfter(ahead30now); // true
http://momentjs.com/docs/#/query/is-after/
if (moment(d).isAfter(ahead30now)) {
// allow input time
console.log('UTC TIME DB', d.format());
} else {
}
像这样将日期传递给时刻,它将比较并给出结果。 如果你不想格式化删除它
moment(Date1).format("YYYY-MM-DD") > moment(Date2).format("YYYY-MM-DD")
对于日期时间比较,您可以使用时刻的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..." ) }
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
在我的情况下,如果报价开始日期小于当前日期,而用户从交易历史记录中打开报价,则必须执行此操作,我需要将当前日期显示为开始日期。
var startDate = "20/05/2018";
var date1 = moment().format("YYYY-MM-DD");
var date2 = moment(startDate).format("YYYY-MM-DD");
// and i checked with if statement
if(date1 > date2){ // if startDate is less than today
startDate = date1;
}else{ // if startDate is greater than today
}
注意:对我来说,它需要将两个日期都转换为相同的格式,并且我使用了“ YYYY-MM-DD”。
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;
}
说如果你想在日期选择器中禁用过去的日期,下面的代码肯定会帮助你 disabledDate={(current) => { return ( current && current.format("YYYY-MM-DD") < moment().格式(“YYYY-MM-DD”)); }}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.