只比较date部分,不用比较JavaScript中的时间

下面的代码有什么问题?

也许只是比较date而不是时间会更简单。 我也不知道如何做到这一点,我搜查了,但我找不到确切的问题。

顺便说一句,当我在一个警报显示两个date,他们performance出完全一样的。

我的代码:

window.addEvent('domready', function() { var now = new Date(); var input = $('datum').getValue(); var dateArray = input.split('/'); var userMonth = parseInt(dateArray[1])-1; var userDate = new Date(); userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds()); if (userDate > now) { alert(now + '\n' + userDate); } }); 

有比较简单的方法来比较date和不包括时间?

我还在学习JavaScript,唯一的方法就是使用Date对象的setHours方法,并设置小时,分钟,秒和毫秒为零。 然后比较两个date。

例如,

 date1 = new Date() date2 = new Date(2011,8,20) 

date2将被设置为小时,分钟,秒和毫秒为零,但是date1会将它们设置为创builddate1的时间。 要摆脱date1上的小时,分​​钟,秒和毫秒,请执行以下操作:

 date1.setHours(0,0,0,0) 

现在,您可以将这两个date作为DATE进行比较,而不用担心时间元素。

这个怎么样?

 Date.prototype.withoutTime = function () { var d = new Date(this); d.setHours(0, 0, 0, 0); return d; } 

它可以让你比较这个date的date部分,而不会影响variables的值:

 var date1 = new Date(2014,1,1); new Date().withoutTime() > date1.withoutTime(); // true 

使用Moment.js

如果你有selectjoin第三方库的话,绝对值得看看Moment.js 。 它使DateDateTime变得非常简单。

例如,如果看到一个date是在另一个date之后,但不包括它们的时间,则可以这样做:

 var date1 = new Date(2016,9,20,12,0,0); // October 20, 2016 12:00:00 var date2 = new Date(2016,9,20,12,1,0); // October 20, 2016 12:01:00 // Comparison including time. moment(date2).isAfter(date1); // => true // Comparison excluding time. moment(date2).isAfter(date1, 'day'); // => false 

您传入的第二个参数isAfter是进行比较的精确度,可以是yearmonthweekdayhourminutesecond任意一个。

这可能是一个稍微干净的版本,还要注意,在使用parseInt的时候应该总是使用一个基数。

 window.addEvent('domready', function() { // Create a Date object set to midnight on today's date var today = new Date((new Date()).setHours(0, 0, 0, 0)), input = $('datum').getValue(), dateArray = input.split('/'), // Always specify a radix with parseInt(), setting the radix to 10 ensures that // the number is interpreted as a decimal. It is particularly important with // dates, if the user had entered '09' for the month and you don't use a // radix '09' is interpreted as an octal number and parseInt would return 0, not 9! userMonth = parseInt(dateArray[1], 10) - 1, // Create a Date object set to midnight on the day the user specified userDate = new Date(dateArray[2], userMonth, dateArray[0], 0, 0, 0, 0); // Convert date objects to milliseconds and compare if(userDate.getTime() > today.getTime()) { alert(today+'\n'+userDate); } }); 

检出MDC parseInt页面以获得更多关于radix的信息。

JSLint是一个非常好的工具,用于捕获缺less的基数等许多可能导致错误和难以debugging错误的事情。 它迫使你使用更好的编码标准,以避免未来的麻烦。 我使用它在我编码的每个JavaScript项目上。

JavaScript的date对象使这不必要的困难,所以它不太可能做得很好。 这个问题被接受的答案陷入了陷阱。

一个JavaScriptdate没有时区的概念 。 这是一个瞬间(从时代开始),用于在“本地”时区翻译string的方便function。 如果要使用date对象处理date,则希望date在相关date开始时表示UTC午夜。 这是一个常见而必要的惯例,可以让你使用date,而不pipe其创build的季节或时区。 所以你需要非常警惕地pipe理时区的概念,特别是当你创build午夜的UTCdate对象时。

大多数时候,你会希望你的date反映用户的时区。 如果今天是您的生日,请点击 。 新西兰和美国用户同时点击并获得不同的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())); 

在创build时注意pipe理时区,现在需要确保在将时区转换回string表示forms时保持时区不变。 所以你可以安全地使用…

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

所以回答你的问题,7年来太晚了…

 <input type="date" onchange="isInPast(event)"> <script> var isInPast = function(event){ debugger; var userEntered = new Date(event.target.valueAsNumber); // valueAsNumber has no time or timezone! var now = new Date(); var today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() )); if(userEntered.getTime() < today.getTime()) alert("date is past"); else if(userEntered.getTime() == today.getTime()) alert("date is today"); else alert("date is future"); } </script> 

看到它正在运行…

date.js库对于这些事情是很方便的。 它使所有JSdate相关的脚本更容易。

由于我在这里没有看到类似的方法,而且我不喜欢将h / m / s / ms设置为0,因为它可能会导致与更改的date对象(我假设是这样)精确过渡到本地时区的问题,我在这里介绍一下,这几个小时前写的,lil函数:

+ :易于使用,进行基本的比较操作(比较日,月,年)。
- :这似乎是“开箱即用”思想的完全相反。

 function datecompare(date1, sign, date2) { var day1 = date1.getDate(); var mon1 = date1.getMonth(); var year1 = date1.getFullYear(); var day2 = date2.getDate(); var mon2 = date2.getMonth(); var year2 = date2.getFullYear(); if (sign === '===') { if (day1 === day2 && mon1 === mon2 && year1 === year2) return true; else return false; } else if (sign === '>') { if (year1 > year2) return true; else if (year1 === year2 && mon1 > mon2) return true; else if (year1 === year2 && mon1 === mon2 && day1 > day2) return true; else return false; } } 

用法:

datecompare(date1, '===', date2)进行相等性检查,
datecompare(date1, '>', date2)进行更大的检查,
!datecompare(date1, '>', date2)进行较less或相等的检查

另外,显然,你可以切换date1date2的地方来实现任何其他简单的比较。

这是我做的方式:

 var myDate = new Date($('input[name=frequency_start]').val()).setHours(0,0,0,0); var today = new Date().setHours(0,0,0,0); if(today>myDate){ jAlert('Please Enter a date in the future','Date Start Error', function(){ $('input[name=frequency_start]').focus().select(); }); } 

简单地比较使用.toDateString如下所示:

 new Date().toDateString(); 

这将只返回你的date部分而不是时间或时区,如下所示:

“2017年2月3日星期五”

因此这两个date都可以在这种格式下进行比较,而不需要时间部分。

确保你用4位数的年份构造userDatesetFullYear(10, ...) !== setFullYear(2010, ...)

在发布这个问题之后,我已经决定发布另外一个解决scheme,因为我没有发现这个解决scheme非常令人满意,至less在我的需求方面:

我用过这样的东西:

 var currentDate= new Date().setHours(0,0,0,0); var startDay = new Date(currentDate - 86400000 * 2); var finalDay = new Date(currentDate + 86400000 * 2); 

这样我就可以用我想要的格式来处理date。 但是这只是为了我的需要,但是我已经决定发布它,也许它会帮助别人

您可以使用总计为ms的算术。

 var date = new Date(date1); date.setHours(0, 0, 0, 0); var diff = date2.getTime() - date.getTime(); return diff >= 0 && diff < 86400000; 

我喜欢这个,因为没有对原始date进行更新,并且执行速度比string拆分和比较更快。

希望这个帮助!