使用JavaScript比较两个日期

有人能建议一种使用JavaScript比较两个日期的值大于、小于和过去没有的方法吗?这些值将来自文本框。

3135864 次浏览
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

什么格式?

如果你构造一个JavascriptDate对象,你可以减去它们来获得毫秒的差异(编辑:或者只是比较它们):

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-t12672js>t3 = new Date('2009 Jan 1')Thu Jan 01 2009 00:00:00 GMT-0500 (Eastern Standard Time)js>t1-t32470768442js>t1>t3true

Date对象将做你想做的事情-为每个日期构建一个,然后使用><<=>=进行比较。

==!====!==运算符要求您使用date.getTime(),如

var d1 = new Date();var d2 = new Date(d1);var same = d1.getTime() === d2.getTime();var notSame = d1.getTime() !== d2.getTime();

要明确的是,直接检查日期对象是否相等是行不通的

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)

不过,我建议您使用下拉列表或类似的日期输入约束形式,而不是文本框,以免您发现自己陷入输入验证地狱。


对于好奇,#0留档

返回指定日期的数值作为自1970年1月1日00:00:00 UTC以来的毫秒数。(对于先前的时间返回负值。)

为了从Javascript中的自由文本创建日期,您需要将其解析为Date()对象。

您可以使用Date.parse()获取免费文本尝试将其转换为新的日期,但如果您可以控制页面,我建议您使用超文本标记语言选择框或日期选择器,例如YUI日历控件jQuery UI Datepicker

一旦你有了一个日期,就像其他人指出的那样,你可以使用简单的算术来减去日期,并通过将数字(以秒为单位)除以一天中的秒数(60*60*24=86400)将其转换回天数。

比较javascript中日期的最简单方法是首先将其转换为Date对象,然后比较这些日期对象。

下面你会发现一个具有三个功能的对象:

  • dates.compare(a, b)

    返回一个数字:

    • -1如果a
    • 0如果a=b
    • 1如果a>b
    • NaN如果a或b是非法日期
  • dates.in范围(d,开始,结束)

    返回布尔值或NaN:

    • 真正如果d开始结束之间(含)
    • 虚假如果d开始之前或之后结束
    • NaN如果一个或多个日期是非法的。
  • dates.convert

    其他函数用于将其输入转换为日期对象。输入可以是

    • 日期-对象:输入按原样返回。
    • an阵列:解释为[年,月,日]。个月是0-11。
    • a数量:解释为自1970年1月1日以来的毫秒数(时间戳)
    • A字符串:支持几种不同的格式,如“YYYY/MM/DD”、“MM/DD/YYYY”、“Jan 31 2009”等。
    • an对象:解释为具有年、月和日期属性的对象。个月是0-11。

.

// Source: http://stackoverflow.com/questions/497790var 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);}}
function datesEqual(a, b){return (!(a>b || b>a))}

日期比较:

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();}

假设你得到了日期对象A和B,得到它们的EPOC时间值,然后减去以毫秒为单位的差异。

var diff = +A - +B;

仅此而已。

“一些”发布的代码的改进版本

/* 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);};

用法:

  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));

到目前为止,最简单的方法是从一个日期减去另一个日期并比较结果。

var oDateOne = new Date();var oDateTwo = new Date();
alert(oDateOne - oDateTwo === 0);alert(oDateOne - oDateTwo < 0);alert(oDateOne - oDateTwo > 0);

如果以下是您的日期格式,您可以使用此代码:

var first = '2012-11-21';var second = '2012-11-03';if(parseInt(first.replace(/-/g,""),10) > parseInt(second.replace(/-/g,""),10)){//...}

它将检查20121121数字是否大于20121103

        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!\nStart Date cannot be after End Date!")
return false;}

使用此代码使用javascript比较日期。

谢谢D. Jeeva

你使用这个代码,

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

我通常将Dates存储为数据库中的timestamps(Number)

当我需要比较时,我只是比较那些时间戳或

将其转换为Date Object,然后在必要时与> <进行比较。

请注意,除非您的变量是同一个Date对象的引用,否则==或===不能正常工作。

首先将这些Date对象转换为时间戳(数字),然后比较它们的相等性。


日期到时间戳

var timestamp_1970 = new Date(0).getTime(); // 1970-01-01 00:00:00var timestamp = new Date().getTime(); // Current Timestamp

时间戳到日期

var timestamp = 0; // 1970-01-01 00:00:00var DateObject = new Date(timestamp);

减去两个日期得到毫秒的差异,如果你得到0,它是相同的日期

function areSameDate(d1, d2){return d1 - d2 === 0}

关系运算符<<=>>=可用于比较JavaScript日期:

var d1 = new Date(2013, 0, 1);var d2 = new Date(2013, 0, 2);d1 <  d2; // trued1 <= d2; // trued1 >  d2; // falsed1 >= d2; // false

但是,相等运算符==!====!==不能用于比较日期因为的(值):

  • 两个不同的对象在严格或抽象比较中永远不会相等。
  • 只有当操作数引用相同的Object时,比较Object的表达式才为真。

您可以使用以下任何方法比较相等日期的值:

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(); // trued1.valueOf() == d2.valueOf(); // trueNumber(d1)   == Number(d2);   // true+d1          == +d2;          // true

#0Date.valueOf()都返回自1970年1月1日00:00 UTC以来的毫秒数。Number函数和一元+运算符都在幕后调用valueOf()方法。

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;}

像往常一样比较<>,但任何涉及=====的内容都应该使用+前缀。像这样:

const x = new Date('2013-05-23');const y = new Date('2013-05-23');
// less than, greater than is fine:console.log('x < y', x < y); // falseconsole.log('x > y', x > y); // falseconsole.log('x <= y', x <= y); // trueconsole.log('x >= y', x >= y); // trueconsole.log('x === y', x === y); // false, oops!
// anything involving '==' or '===' should use the '+' prefix// it will then compare the dates' millisecond values
console.log('+x === +y', +x === +y); // true

简短的回答

这是一个函数,如果from dateTime>到dateTime演示在行动,则返回{boolean}

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

补充说明

jsFiddle

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() ; //1375077000000console.log(typeof timeStamp_date_one);//numbervar timeStamp_date_two = new Date(date_two).getTime() ;//1375080600000console.log(typeof timeStamp_date_two);//number

因为你现在在数字类型中同时拥有两个datetime您可以将它们与任何比较操作进行比较

(>,<; ,= ,! = ,== ,! == ,>= <=)

然后

如果您熟悉C#自定义日期和时间格式字符串,这个库应该做同样的事情,并帮助您格式化日期和时间dtmFRM无论您是传递日期时间字符串还是unix格式

用法

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

演示

您所要做的就是将这些格式中的任何一种传递到库js文件中

这是我在一个项目中做的,

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 Oracletform.START_DATE.value = estStartDate + " 00:00:00";}
if(tform.END_DATE.value!=""){var estEndDate = tform.END_DATE.value;//format for Oracletform.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;}}

在表单上调用它。希望有帮助

仅比较天(忽略时间分量):

Date.prototype.sameDay = function(d) {return this.getFullYear() === d.getFullYear()&& this.getDate() === d.getDate()&& this.getMonth() === d.getMonth();}

用法:

if(date1.sameDay(date2)) {// highlight day on calendar or something else clever}

我不再建议修改内置对象的prototype。改为尝试以下操作:

function isSameDay(d1, d2) {return d1.getFullYear() === d2.getFullYear() &&d1.getDate() === d2.getDate() &&d1.getMonth() === d2.getMonth();}

console.log(isSameDay(new Date('Jan 15 2021 02:39:53 GMT-0800'), new Date('Jan 15 2021 23:39:53 GMT-0800')));console.log(isSameDay(new Date('Jan 15 2021 10:39:53 GMT-0800'), new Date('Jan 16 2021 10:39:53 GMT-0800')));

注意:年/月/日将返回您的时区;如果您想检查两个日期是否在不同时区的同一天,我建议使用时区感知库。

e. g.

> (new Date('Jan 15 2021 01:39:53 Z')).getDate()  // Jan 15 in UTC14  // Returns "14" because I'm in GMT-08

在比较Dates对象之前,尝试像Date.setMilliseconds(0);一样将它们的两个毫秒都设置为零。

在某些情况下,Date对象是在javascript中动态创建的,如果您继续打印Date.getTime(),您将看到毫秒变化,这将阻止两个日期相等。

尝试使用此代码

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");}

只是为了在许多现有选项中添加另一种可能性,您可以尝试:

if (date1.valueOf()==date2.valueOf()) .....

…这似乎对我有用。当然,你必须确保两个日期都不是未定义的…

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():0) .....

通过这种方式,我们可以确保如果两者都未定义,或者…

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():-1) .....

…如果你希望他们不平等。

让我们假设你处理这个2014[:-/.]06[:-/.]06或这个06[:-/.]06[:-/.]2014日期格式,那么你可以这样比较日期

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, '')); // trueparseInt(c.replace(/[:\s\/\.-]/g, '')) == parseInt(d.replace(/[:\s\/\.-]/g, '')); // trueparseInt(a.replace(/[:\s\/\.-]/g, '')) < parseInt(b.replace(/[:\s\/\.-]/g, '')); // falseparseInt(c.replace(/[:\s\/\.-]/g, '')) > parseInt(d.replace(/[:\s\/\.-]/g, '')); // false

如你所见,我们去掉分隔符,然后比较整数。

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;}

嗨,这是我比较日期的代码。在我的情况下,我正在检查不允许选择过去的日期。

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;

通过Moment.js

代码说明: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

要比较两个日期,我们可以使用date.jsJavaScript库,可以在以下位置找到:https://code.google.com/archive/p/datejs/downloads

并使用Date.compare( Date date1, Date date2 )方法,它返回数量,这意味着以下结果:

-1=date1小于date2。

0=值相等。

1=date1大于date2。

另一种比较两个日期的方法是通过#0方法。这在与保存在字符串中的固定日期进行比较时特别有用,因为您可以避免创建短暂的对象。凭借ISO 8601格式,您可以按字典顺序比较这些字符串(至少当您使用相同的时区时)。

我并不是说它比使用时间对象或时间戳更好;只是提供了另一种选择。这可能会失败,但我还没有偶然发现它们:)

注意-仅比较日期部分:

当我们在javascript中比较两个日期时。也需要考虑小时、分钟和秒。所以如果我们只需要比较日期,这是方法:

var date1= new Date("01/01/2014").setHours(0,0,0,0);
var date2= new Date("01/01/2014").setHours(0,0,0,0);

现在:if date1.valueOf()> date2.valueOf()将像魅力一样工作。

试试这个而比较日期应为iso格式“yyyy-MM-dd”如果您只想比较日期,请使用此日期助手

<a href="https://plnkr.co/edit/9N8ZcC?p=preview"> Live Demo</a>

在JavaScript中比较日期很容易……JavaScript有日期内置比较系统,这使得进行比较变得非常容易……

只需按照这些步骤比较2个日期值,例如,您有2个输入,每个输入在String中都有一个日期值,您要比较它们…

1.你有2个字符串值,你从输入中得到,你想比较它们,它们如下:

var date1 = '01/12/2018';var date2 = '12/12/2018';

2.它们需要Date Object才能作为日期值进行比较,所以只需使用new Date()将它们转换为日期,我只是为了简单的解释而重新分配它们,但您可以随心所欲地进行:

date1 = new Date(date1);date2 = new Date(date2);

3.现在简单地比较它们,使用><>=<=

date1 > date2;  //falsedate1 < date2;  //truedate1 >= date2; //falsedate1 <= date2; //true

比较javascript中的日期

你可以用最简单易懂的方式进行日期比较。

<input type="date" id="getdate1" /><input type="date" id="getdate2" />

假设您有两个日期输入要比较它们。

所以首先写一个通用的方法来解析日期。

 <script type="text/javascript">function parseDate(input) {var datecomp= input.split('.'); //if date format 21.09.2017
var tparts=timecomp.split(':');//if time also givingreturn new Date(dparts[2], dparts[1]-1, dparts[0], tparts[0], tparts[1]);// here new date(  year, month, date,)}</script>

parseDate()是用于解析日期的make通用方法。现在你可以检查你的日期 =, > ,&它;任何类型的比较

    <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 requirmentif(Date1 = Date2){return false;  //or your code {}}});</script>

当然,这段代码会帮助你。

注意时区

javascript日期有没有时区的概念。它是一个时间时刻(自纪元起的滴答声),带有方便的函数,用于在“本地”时区中转换字符串。如果您想使用日期对象处理日期,就像这里的每个人都在做的那样,您希望您的日期代表相关日期开始时的UTC午夜。这是一个常见且必要的约定,允许您处理日期,而不管它们创建的季节或时区。因此,您需要非常警惕地管理时区的概念,特别是在创建午夜UTC Date对象时。

大多数时候,您希望您的日期反映用户的时区。点击如果今天是你的生日。新西兰和美国的用户同时单击并获得不同的日期。在这种情况下,请执行此操作…

// 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()));

有时,国际可比性胜过当地准确性。在这种情况下,这样做…

// 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()

简单的方法是,

var first = '2012-11-21';var second = '2012-11-03';
if (new Date(first) > new Date(second) {.....}

上述所有答案只解决了一件事:比较两个日期。

事实上,它们似乎是问题的答案,但缺少很大一部分:

如果我想检查一个人是否满18岁怎么办?

不幸的是,上述答案中没有一个能够回答这个问题。

例如,当前时间(大约是我开始键入这些单词的时间)是Fri Jan 31 2020 10:41:04 GMT-0600(中央标准时间),而客户输入他的出生日期为“01/31/2002”。

如果我们使用“365天/年”,即“31536000000”毫秒,我们将得到以下结果:

       let currentTime = new Date();let customerTime = new Date(2002, 1, 31);let age = (currentTime.getTime() - customerTime.getTime()) / 31536000000console.log("age: ", age);

并打印如下:

       age: 17.92724710838407

但是法律上,那个客户已经18岁了。即使他输入“01/30/2002”,结果仍然是

       age: 17.930039743467784

小于18岁。系统将报告“未成年”错误。

这将继续为“01/29/2002”,“01/28/2002”,“01/27/2002”……“01/05/2002”,直到“01/04/2002”。

这样的系统只会杀死所有在18岁0天和18岁26天前出生的客户,因为他们在法律上是18岁,而系统显示“未成年”。

以下是对这样一个问题的回答:

invalidBirthDate: 'Invalid date. YEAR cannot be before 1900.',invalidAge: 'Invalid age. AGE cannot be less than 18.',
public static birthDateValidator(control: any): any {const val = control.value;if (val != null) {const slashSplit = val.split('-');if (slashSplit.length === 3) {const customerYear = parseInt(slashSplit[0], 10);const customerMonth = parseInt(slashSplit[1], 10);const customerDate = parseInt(slashSplit[2], 10);if (customerYear < 1900) {return { invalidBirthDate: true };} else {const currentTime = new Date();const currentYear = currentTime.getFullYear();const currentMonth = currentTime.getMonth() + 1;const currentDate = currentTime.getDate();if (currentYear - customerYear < 18) {return { invalidAge: true };} else if (currentYear - customerYear === 18 &&currentMonth - customerMonth < 0) {return { invalidAge: true };} else if (currentYear - customerYear === 18 &&currentMonth - customerMonth === 0 &&currentDate - customerDate < 0) {return { invalidAge: true };} else {return null;}}}}}

性能

今天2020.02.27我在MacO High Sierra v10.13.6上Chromev80.0,Safariv13.0.5和Firefox 73.0.1上执行所选解决方案的测试

结论

  • 解决方案d1==d2(D)和d1===d2(E)对于所有浏览器来说都是最快的
  • 解决方案getTime(A)比valueOf(B)快(两者都是中等速度)
  • 解决方案F,L,N对于所有浏览器来说都是最慢的

在此处输入图片描述

详情

下面提供了性能测试中使用的解决方案片段。您可以在您的机器这里中执行测试

function A(d1,d2) {return d1.getTime() == d2.getTime();}
function B(d1,d2) {return d1.valueOf() == d2.valueOf();}
function C(d1,d2) {return Number(d1)   == Number(d2);}
function D(d1,d2) {return d1 == d2;}
function E(d1,d2) {return d1 === d2;}
function F(d1,d2) {return (!(d1>d2 || d2>d1));}
function G(d1,d2) {return d1*1 == d2*1;}
function H(d1,d2) {return +d1 == +d2;}
function I(d1,d2) {return !(+d1 - +d2);}
function J(d1,d2) {return !(d1 - d2);}
function K(d1,d2) {return d1 - d2 == 0;}
function L(d1,d2) {return !((d1>d2)-(d1<d2));}
function M(d1,d2) {return d1.getFullYear() === d2.getFullYear()&& d1.getDate() === d2.getDate()&& d1.getMonth() === d2.getMonth();}
function N(d1,d2) {return (isFinite(d1.valueOf()) && isFinite(d2.valueOf()) ? !((d1>d2)-(d1<d2)) : false );}

// TEST
let past= new Date('2002-12-24'); // pastlet now= new Date('2020-02-26');  // now
console.log('Code  d1>d2  d1<d2  d1=d2')var log = (l,f) => console.log(`${l}     ${f(now,past)}  ${f(past,now)}  ${f(now,now)}`);
log('A',A);log('B',B);log('C',C);log('D',D);log('E',E);log('G',G);log('H',H);log('I',I);log('J',J);log('K',K);log('L',L);log('M',M);log('N',N);
p {color: red}
<p>This snippet only presents tested solutions (it not perform tests itself)</p>

Chrome的搜索结果

在此处输入图片描述

If you are using **REACT OR REACT NATIVE**, use this and it will work (Working like charm)

如果两个日期相同,则返回TRUE,否则返回FALSE

const compareDate = (dateVal1, dateVal2) => {if (dateVal1.valueOf() === dateVal2.valueOf()){return true;}else { return false;}}

使用Momjs进行日期操作。


用于检查一个日期是否与另一个日期相同或之后,使用

isSameOrAfter() 方法

moment('2010-10-20').isSameOrAfter('2010-10-20') //true;

用于检查一个日期是否在另一个日期之后,使用isAfter()方法

moment('2020-01-20').isAfter('2020-01-21'); // falsemoment('2020-01-20').isAfter('2020-01-19'); // true

检查一个日期是否在另一个日期之前isBefore()方法。

moment('2020-01-20').isBefore('2020-01-21'); // truemoment('2020-01-20').isBefore('2020-01-19'); // false

检查一个日期是否与另一个日期相同isSame()方法

moment('2020-01-20').isSame('2020-01-21'); // falsemoment('2020-01-20').isSame('2020-01-20'); // true
function compare_date(date1, date2){const x = new Date(date1)const y = new Date(date2)function checkyear(x, y){if(x.getFullYear()>y.getFullYear()){return "Date1 > Date2"}else if(x.getFullYear()<y.getFullYear()){return "Date2 > Date1"}else{return checkmonth(x, y)}}function checkmonth(x, y){if(x.getMonth()>y.getFullYear()){return "Date1 > Date2"}else if(x.getMonth()<y.getMonth){return "Date2 > Date1"}else {return checkDate(x, y)}}function checkDate(x, y){if(x.getDate()>y.getFullYear()){return "Date1 > Date2"}else if(x.getDate()<y.getDate()){return "Date2 > Date1"}else {return checkhour(x,y)}}function checkhour(x, y){if(x.getHours()>y.getHours()){return "Date1 > Date2"}else if(x.getHours()<y.getHours()){return "Date2 > Date1"}else {return checkhmin(x,y)}}function checkhmin(x,y){if(x.getMinutes()>y.getMinutes()){return "Date1 > Date2"}else if(x.getMinutes()<y.getMinutes()){return "Date2 > Date1"}else {return "Date1 = Date2"}}return checkyear(x, y)

我对这个问题的简单回答

checkDisabled(date) {const today = new Date()const newDate = new Date(date._d)if (today.getTime() > newDate.getTime()) {return true}return false}       

如果两个日期的格式都是“YYYY-MM-DD”,则可以跳过Date对象并直接比较字符串。

这是因为字符串在JS中是如何比较的

let date1 = '2022-12-13';let date2 = '2022-02-13';
console.log(`${date1} > ${date2}`, date1 > date2);console.log(`${date1} < ${date2}`, date1 < date2);console.log(`${date1} == ${date2}`, date1 == date2);