Compare two dates with JavaScript
有人能建议一种方法来比较两个日期的值大于、小于和不在过去使用javascript吗?这些值将来自文本框。
日期对象将按您的需要进行操作-为每个日期构造一个日期,然后使用
1 2 3 4 | var d1 = new Date(); var d2 = new Date(d1); var same = d1.getTime() === d2.getTime(); var notSame = d1.getTime() !== d2.getTime(); |
很明显,直接检查数据对象是否相等是行不通的。
1 2 3 4 5 6 7 8 | var d1 = new Date(); var d2 = new Date(d1); console.log(d1 == d2); // prints false (wrong!) console.log(d1 === d2); // prints false (wrong!) console.log(d1 != d2); // prints true (wrong!) console.log(d1 !== d2); // prints true (wrong!) console.log(d1.getTime() === d2.getTime()); // prints true (correct) |
不过,我建议您使用下拉列表或类似的日期输入约束形式,而不是文本框,以免您发现自己身处输入验证地狱。
在javascript中比较日期的最简单方法是首先将其转换为日期对象,然后比较这些日期对象。
下面是一个具有三个功能的对象:
日期。比较(a,b)
返回一个数字:
- -如果A<1
- 0如果a= b
- 1如果A>B
- 如果A或B是非法日期,则为NAN
日期.inrange(d,开始,结束)
返回布尔值或NaN:
- 如果d介于开始和结束(包括)之间,则为true
- 如果d在开始之前或结束之后,则为false。
- 如果一个或多个日期是非法的。
数据转换
其他函数用于将其输入转换为日期对象。输入可以是
- 日期对象:输入按原样返回。
- 数组:解释为[年、月、日]。注:月份为0-11。
- 数字:解释为1970年1月1日以来的毫秒数(时间戳)
- 字符串:支持几种不同的格式,如"yyyy/mm/dd"、"mm/dd/yyyy"、"jan 31 2009"等。
- 对象:解释为具有年、月和日期属性的对象。注:月份为0-11。
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | // Source: http://stackoverflow.com/questions/497790 var dates = { convert:function(d) { // Converts the date in d to a date-object. The input can be: // a date object: returned without modification // an array : Interpreted as [year,month,day]. NOTE: month is 0-11. // a number : Interpreted as number of milliseconds // since 1 Jan 1970 (a timestamp) // a string : Any format supported by the javascript engine, like // "YYYY/MM/DD","MM/DD/YYYY","Jan 31 2009" etc. // an object : Interpreted as an object with year, month and date // attributes. **NOTE** month is 0-11. return ( d.constructor === Date ? d : d.constructor === Array ? new Date(d[0],d[1],d[2]) : d.constructor === Number ? new Date(d) : d.constructor === String ? new Date(d) : typeof d ==="object" ? new Date(d.year,d.month,d.date) : NaN ); }, compare:function(a,b) { // Compare two dates (could be of any type supported by the convert // function above) and returns: // -1 : if a < b // 0 : if a = b // 1 : if a > b // NaN : if a or b is an illegal date // NOTE: The code inside isFinite does an assignment (=). return ( isFinite(a=this.convert(a).valueOf()) && isFinite(b=this.convert(b).valueOf()) ? (a>b)-(a<b) : NaN ); }, inRange:function(d,start,end) { // Checks if date in d is between dates in start and end. // Returns a boolean or NaN: // true : if d is between start and end (inclusive) // false : if d is before start or after end // NaN : if one or more of the dates is illegal. // NOTE: The code inside isFinite does an assignment (=). return ( isFinite(d=this.convert(d).valueOf()) && isFinite(start=this.convert(start).valueOf()) && isFinite(end=this.convert(end).valueOf()) ? start <= d && d <= end : NaN ); } } |
像往常一样比较
1 2 3 4 5 6 7 8 9 10 11 12 13 | var x = new Date('2013-05-23'); var y = new Date('2013-05-23'); // less than, greater than is fine: x < y; => false x > y; => false x === y; => false, oops! // anything involving '=' should use the '+' prefix // it will then compare the dates' millisecond values +x <= +y; => true +x >= +y; => true +x === +y; => true |
希望这有帮助!
关系运算符
1 2 3 4 5 6 | var d1 = new Date(2013, 0, 1); var d2 = new Date(2013, 0, 2); d1 < d2; // true d1 <= d2; // true d1 > d2; // false d1 >= d2; // false |
但是,相等运算符
- Two distinct objects are never equal for either strict or abstract comparisons.
- An expression comparing Objects is only true if the operands reference the same Object.
您可以使用以下任何方法比较日期值是否相等:
1 2 3 4 5 6 7 8 9 | var d1 = new Date(2013, 0, 1); var d2 = new Date(2013, 0, 1); /* * note: d1 == d2 returns false as described above */ d1.getTime() == d2.getTime(); // true d1.valueOf() == d2.valueOf(); // true Number(d1) == Number(d2); // true +d1 == +d2; // true |
到目前为止,最简单的方法是从另一个日期中减去一个日期,然后比较结果。
1 2 3 4 5 6 | var oDateOne = new Date(); var oDateTwo = new Date(); alert(oDateOne - oDateTwo === 0); alert(oDateOne - oDateTwo < 0); alert(oDateOne - oDateTwo > 0); |
在javascript中比较日期很容易…javascript有内置的日期比较系统,这使得比较非常容易…
只需按照以下步骤比较两个日期值,例如,您有两个输入,每个输入在
1。您有两个从输入中获得的字符串值,希望对它们进行比较,如下所示:
1 2 | var date1 = '01/12/2018'; var date2 = '12/12/2018'; |
2。它们需要是
1 2 | date1 = new Date(date1); date2 = new Date(date2); |
三。现在简单地比较一下,使用
1 2 3 4 | date1 > date2; //false date1 < date2; //true date1 >= date2; //false date1 <= date2; //true |
仅比较日期(忽略时间组件):
1 2 3 4 5 | Date.prototype.sameDay = function(d) { return this.getFullYear() === d.getFullYear() && this.getDate() === d.getDate() && this.getMonth() === d.getMonth(); } |
用途:
1 2 3 | if(date1.sameDay(date2)) { // highlight day on calendar or something else clever } |
什么格式?
如果构造一个javascript日期对象,只需减去它们就可以得到毫秒的差异(编辑:或比较它们):
1 2 3 4 5 6 7 8 9 10 11 12 | js>t1 = new Date() Thu Jan 29 2009 14:19:28 GMT-0500 (Eastern Standard Time) js>t2 = new Date() Thu Jan 29 2009 14:19:31 GMT-0500 (Eastern Standard Time) js>t2-t1 2672 js>t3 = new Date('2009 Jan 1') Thu Jan 01 2009 00:00:00 GMT-0500 (Eastern Standard Time) js>t1-t3 2470768442 js>t1>t3 true |
使用此代码,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var firstValue ="2012-05-12".split('-'); var secondValue ="2014-07-12".split('-'); var firstDate=new Date(); firstDate.setFullYear(firstValue[0],(firstValue[1] - 1 ),firstValue[2]); var secondDate=new Date(); secondDate.setFullYear(secondValue[0],(secondValue[1] - 1 ),secondValue[2]); if (firstDate > secondDate) { alert("First Date is greater than Second Date"); } else { alert("Second Date is greater than First Date"); } |
还要检查这个链接http://www.w3schools.com/js/js_obj_date.asp
简短回答
这里有一个函数,如果"从日期时间>到日期时间"演示正在运行,则返回布尔值
1 2 3 4 5 6 7 | var from = '08/19/2013 00:00' var to = '08/12/2013 00:00 ' function isFromBiggerThanTo(dtmfrom, dtmto){ return new Date(dtmfrom).getTime() >= new Date(dtmto).getTime() ; } console.log(isFromBiggerThanTo(from, to)); //true |
解释
杰西德
1 2 3 4 5 6 7 | var date_one = '2013-07-29 01:50:00', date_two = '2013-07-29 02:50:00'; //getTime() returns the number of milliseconds since 01.01.1970. var timeStamp_date_one = new Date(date_one).getTime() ; //1375077000000 console.log(typeof timeStamp_date_one);//number var timeStamp_date_two = new Date(date_two).getTime() ;//1375080600000 console.log(typeof timeStamp_date_two);//number |
因为您现在在数字类型中都有日期时间您可以将它们与任何比较操作进行比较
(>,<,=,!=,=,!=,> =和<=)
然后
如果您熟悉
用法
1 2 3 4 5 6 7 8 9 10 | var myDateTime = new dtmFRM(); alert(myDateTime.ToString(1375077000000,"MM/dd/yyyy hh:mm:ss ampm")); //07/29/2013 01:50:00 AM alert(myDateTime.ToString(1375077000000,"the year is yyyy and the day is dddd")); //this year is 2013 and the day is Monday alert(myDateTime.ToString('1/21/2014',"this month is MMMM and the day is dd")); //this month is january and the day is 21 |
演示
您所要做的就是传递库
1 2 3 4 | function datesEqual(a, b) { return (!(a>b || b>a)) } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | var date = new Date(); // will give you todays date. // following calls, will let you set new dates. setDate() setFullYear() setHours() setMilliseconds() setMinutes() setMonth() setSeconds() setTime() var yesterday = new Date(); yesterday.setDate(...date info here); if(date>yesterday) // will compare dates |
只需为现有的许多选项添加另一种可能性,您可以尝试:
1 | if (date1.valueOf()==date2.valueOf()) ..... |
…这似乎对我有用。当然,你必须确保这两个日期都没有被定义…
1 | if ((date1?date1.valueOf():0)==(date2?date2.valueOf():0) ..... |
这样我们就可以确保,如果两者都未定义,或者……
1 | if ((date1?date1.valueOf():0)==(date2?date2.valueOf():-1) ..... |
…如果你不希望他们平等。
注-仅比较日期部分:
当我们在javascript中比较两个日期时。这需要数小时、数分钟和数秒的时间。因此,如果我们只需要比较日期,这就是方法:
1 2 3 | var date1= new Date("01/01/2014").setHours(0,0,0,0); var date2= new Date("01/01/2014").setHours(0,0,0,0); |
现在:
通过瞬间
J小提琴:http://jsfiddle.net/guhokemk/1/
1 2 3 4 5 6 7 8 9 | 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")); |
如果
如果
如果
为了比较两个日期,我们可以使用date.js javascript库,可以在以下网址找到:https://code.google.com/archive/p/datejs/downloads
并使用
-1=日期1等于日期2。
0=值相等。
1=日期1大于日期2。
当心时区
javascript日期没有时区概念。这是一个时间时刻(从新纪元开始计时),在"本地"时区,可以方便地转换字符串和字符串。如果您希望使用日期对象处理日期,就像这里的每个人所做的那样,您希望您的日期在相关日期开始时表示UTC午夜。这是一种常见且必要的约定,允许您处理日期,而不管日期的创建季节或时区如何。因此,您需要非常警惕地管理时区的概念,特别是在创建午夜UTC日期对象时。
大多数情况下,您希望您的日期反映用户的时区。如果今天是您的生日,请单击。新西兰和美国的用户同时点击并获得不同的日期。在这种情况下,这样做…
1 2 | // create a date (utc midnight) reflecting the value of myDate and the environment's timezone offset. new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate())); |
有时,国际可比性胜过地方准确性。在这种情况下,这样做…
1 2 | // the date in London of a moment in time. Device timezone is ignored. new Date(Date.UTC(myDate.getUTCYear(), myDate.getyUTCMonth(), myDate.getUTCDate())); |
现在,您可以像其他答案建议的那样直接比较日期对象。
在创建时注意管理时区之后,还需要确保在转换回字符串表示形式时不使用时区。所以你可以安全地使用…
toISOString() getUTCxxx() getTime() //returns a number with no time or timezone. .toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.
完全避免其他事情,尤其是…
getYear() 、getMonth() 、getDate() 。
为了从javascript中的自由文本创建日期,需要将其解析为date()对象。
您可以使用date.parse()获取自由文本,尝试将其转换为新的日期,但如果您可以控制页面,我建议您改用HTML选择框或日期选取器,如yui日历控件或jquery ui日期选取器。
一旦你有了其他人指出的日期,你就可以用简单的算术方法减去日期,然后将其转换回天数,方法是将数字(以秒为单位)除以一天中的秒数(60*60*24=86400)。
假设你得到日期对象A和B,得到它们的epoc时间值,然后减去得到以毫秒为单位的差。
1 | var diff = +A - +B; |
这就是全部。
减去两个日期得到毫秒的差,如果你得到dOCx1〔14〕,它是同一个日期。
1 2 3 | function areSameDate(d1, d2){ return d1 - d2 === 0 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | var date_today=new Date(); var formated_date = formatDate(date_today);//Calling formatDate Function var input_date="2015/04/22 11:12 AM"; var currentDateTime = new Date(Date.parse(formated_date)); var inputDateTime = new Date(Date.parse(input_date)); if (inputDateTime <= currentDateTime){ //Do something... } function formatDate(date) { var hours = date.getHours(); var minutes = date.getMinutes(); var ampm = hours >= 12 ? 'PM' : 'AM'; hours = hours % 12; hours = hours ? hours : 12; // the hour '0' should be '12' hours = hours < 10 ? '0'+hours : hours ; minutes = minutes < 10 ? '0'+minutes : minutes; var strTime = hours+":"+minutes+ ' ' + ampm; return date.getFullYear()+"/" + ((date.getMonth()+1) < 10 ?"0"+(date.getMonth()+1) : (date.getMonth()+1) ) +"/" + (date.getDate() < 10 ?"0"+date.getDate() : date.getDate()) +"" + strTime; } |
由"some"发布的代码的改进版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /* Compare the current date against another date. * * @param b {Date} the other date * @returns -1 : if this < b * 0 : if this === b * 1 : if this > b * NaN : if a or b is an illegal date */ Date.prototype.compare = function(b) { if (b.constructor !== Date) { throw"invalid_date"; } return (isFinite(this.valueOf()) && isFinite(b.valueOf()) ? (this>b)-(this<b) : NaN ); }; |
用途:
1 2 3 4 5 6 7 8 9 | var a = new Date(2011, 1-1, 1); var b = new Date(2011, 1-1, 1); var c = new Date(2011, 1-1, 31); var d = new Date(2011, 1-1, 31); assertEquals( 0, a.compare(b)); assertEquals( 0, b.compare(a)); assertEquals(-1, a.compare(c)); assertEquals( 1, c.compare(a)); |
我通常把
当我需要比较时,我只需要比较那些时间戳或
将其转换为日期对象,然后在必要时与
注意,除非您的变量是同一日期对象的引用,否则==或==无法正常工作。
首先将这些日期对象转换为时间戳(数字),然后比较它们的相等性。
日期到时间戳1 2 | var timestamp_1970 = new Date(0).getTime(); // 1970-01-01 00:00:00 var timestamp = new Date().getTime(); // Current Timestamp |
时间戳结束日期
1 2 | var timestamp = 0; // 1970-01-01 00:00:00 var DateObject = new Date(timestamp); |
如果以下是日期格式,则可以使用此代码:
1 2 3 4 5 | var first = '2012-11-21'; var second = '2012-11-03'; if(parseInt(first.replace(/-/g,""),10) > parseInt(second.replace(/-/g,""),10)){ //... } |
检查
在比较
在某些情况下,如果使用javascript动态创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | var curDate=new Date(); var startDate=document.forms[0].m_strStartDate; var endDate=document.forms[0].m_strEndDate; var startDateVal=startDate.value.split('-'); var endDateVal=endDate.value.split('-'); var firstDate=new Date(); firstDate.setFullYear(startDateVal[2], (startDateVal[1] - 1), startDateVal[0]); var secondDate=new Date(); secondDate.setFullYear(endDateVal[2], (endDateVal[1] - 1), endDateVal[0]); if(firstDate > curDate) { alert("Start date cannot be greater than current date!"); return false; } if (firstDate > secondDate) { alert("Start date cannot be greater!"); return false; } |
另一种比较两个日期的方法是通过
我不一定要说它比使用时间对象或时间戳更好,只是将它作为另一个选项提供。这可能会失败,但我还没有偶然发现它们:)
假设您处理这个
1 2 3 4 5 6 | var a = '2014.06/07', b = '2014-06.07', c = '07-06/2014', d = '07/06.2014'; parseInt(a.replace(/[:\s\/\.-]/g, '')) == parseInt(b.replace(/[:\s\/\.-]/g, '')); // true parseInt(c.replace(/[:\s\/\.-]/g, '')) == parseInt(d.replace(/[:\s\/\.-]/g, '')); // true parseInt(a.replace(/[:\s\/\.-]/g, '')) < parseInt(b.replace(/[:\s\/\.-]/g, '')); // false parseInt(c.replace(/[:\s\/\.-]/g, '')) > parseInt(d.replace(/[:\s\/\.-]/g, '')); // false |
如您所见,我们去掉分隔符,然后比较整数。
嗨,这是我比较日期的代码。在我的例子中,我做了一个检查,不允许选择过去的日期。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var myPickupDate = <pick up date> ; var isPastPickupDateSelected = false; var currentDate = new Date(); if(currentDate.getFullYear() <= myPickupDate.getFullYear()){ if(currentDate.getMonth()+1 <= myPickupDate.getMonth()+1 || currentDate.getFullYear() < myPickupDate.getFullYear()){ if(currentDate.getDate() <= myPickupDate.getDate() || currentDate.getMonth()+1 < myPickupDate.getMonth()+1 || currentDate.getFullYear() < myPickupDate.getFullYear()){ isPastPickupDateSelected = false; return; } } } console.log("cannot select past pickup date"); isPastPickupDateSelected = true; |
以下是我在一个项目中所做的,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | function CompareDate(tform){ var startDate = new Date(document.getElementById("START_DATE").value.substring(0,10)); var endDate = new Date(document.getElementById("END_DATE").value.substring(0,10)); if(tform.START_DATE.value!=""){ var estStartDate = tform.START_DATE.value; //format for Oracle tform.START_DATE.value = estStartDate +" 00:00:00"; } if(tform.END_DATE.value!=""){ var estEndDate = tform.END_DATE.value; //format for Oracle tform.END_DATE.value = estEndDate +" 00:00:00"; } if(endDate <= startDate){ alert("End date cannot be smaller than or equal to Start date, please review you selection."); tform.START_DATE.value = document.getElementById("START_DATE").value.substring(0,10); tform.END_DATE.value = document.getElementById("END_DATE").value.substring(0,10); return false; } } |
在表单OnSubmit上调用此。希望这有帮助。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from_date ='10-07-2012'; to_date = '05-05-2012'; var fromdate = from_date.split('-'); from_date = new Date(); from_date.setFullYear(fromdate[2],fromdate[1]-1,fromdate[0]); var todate = to_date.split('-'); to_date = new Date(); to_date.setFullYear(todate[2],todate[1]-1,todate[0]); if (from_date > to_date ) { alert("Invalid Date Range! Start Date cannot be after End Date!") return false; } |
使用此代码使用javascript比较日期。
谢谢杰瓦
试试这个比较日期应为ISO格式"年-月-日"如果只想比较日期,请使用此日期帮助器
1 | Live Demo |
你可以用最简单易懂的方式来比较日期。
1 2 | <input type="date" id="getdate1" /> <input type="date" id="getdate2" /> |
假设您有两个要比较的日期输入。
因此,首先编写一个通用的数据解析方法。
1 2 3 4 5 6 7 8 | <script type="text/javascript"> function parseDate(input) { var datecomp= input.split('.'); //if date format 21.09.2017 var tparts=timecomp.split(':');//if time also giving return new Date(dparts[2], dparts[1]-1, dparts[0], tparts[0], tparts[1]); // here new date( year, month, date,) } |
parseDate()是解析日期的常见方法。现在您可以检查您的日期=,>,<任何类型的比较
1 2 3 4 5 6 7 8 9 10 11 | <script type="text/javascript"> $(document).ready(function(){ //parseDate(pass in this method date); Var Date1=parseDate($("#getdate1").val()); Var Date2=parseDate($("#getdate2").val()); //use any oe < or > or = as per ur requirment if(Date1 = Date2){ return false; //or your code {} } }); |
当然,此代码将帮助您。
尝试使用此代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | var f =date1.split("/"); var t =date2.split("/"); var x =parseInt(f[2]+f[1]+f[0]); var y =parseInt(t[2]+t[1]+t[0]); if(x > y){ alert("date1 is after date2"); } else if(x < y){ alert("date1 is before date2"); } else{ alert("both date are same"); } |
日期比较:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | var str1 = document.getElementById("Fromdate").value; var str2 = document.getElementById("Todate").value; var dt1 = parseInt(str1.substring(0,2),10); var mon1 = parseInt(str1.substring(3,5),10); var yr1 = parseInt(str1.substring(6,10),10); var dt2 = parseInt(str2.substring(0,2),10); var mon2 = parseInt(str2.substring(3,5),10); var yr2 = parseInt(str2.substring(6,10),10); var date1 = new Date(yr1, mon1, dt1); var date2 = new Date(yr2, mon2, dt2); if(date2 < date1) { alert("To date cannot be greater than from date"); return false; } else { alert("Submitting ..."); document.form1.submit(); } |