在JavaScript中仅比较日期部分而不比较时间
下面的代码有什么问题 也许比较日期而不是时间会更简单。我也不知道该怎么做,于是我搜索了一下,但找不到确切的问题 顺便说一句,当我在警报中显示这两个日期时,它们显示的完全相同 我的代码:在JavaScript中仅比较日期部分而不比较时间,javascript,date,comparison,mootools,Javascript,Date,Comparison,Mootools,下面的代码有什么问题 也许比较日期而不是时间会更简单。我也不知道该怎么做,于是我搜索了一下,但找不到确切的问题 顺便说一句,当我在警报中显示这两个日期时,它们显示的完全相同 我的代码: window.addEvent('domready', function() { var now = new Date(); var input = $('datum').getValue(); var dateArray = input.split('/'); var userM
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);
}
});
有没有一种比较日期而不包括时间的更简单的方法?对于这些事情,这个库很方便。它使所有与JS日期相关的涂鸦变得更加容易。请确保使用4位数的年份构建
userDate
,如setFullYear(10,…!==setFullYear(2010,…)
我仍在学习JavaScript,我发现比较两个没有时间的日期的唯一方法是使用Date对象的方法,将小时、分钟、秒和毫秒设置为零。然后比较两个日期
比如说,
date1 = new Date()
date2 = new Date(2011,8,20)
date2
将小时、分钟、秒和毫秒设置为零,但date1将它们设置为创建date1的时间。要消除date1上的小时、分钟、秒和毫秒,请执行以下操作:
date1.setHours(0,0,0,0)
现在,您可以仅将这两个日期作为日期进行比较,而不必担心时间元素。这可能是一个更简洁的版本,还请注意,在使用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页面
是一个很好的工具,可以捕获丢失的基数和许多其他可能导致模糊和难以调试的错误的东西。它迫使您使用更好的编码标准,以避免将来的麻烦。我在我编写的每个JavaScript项目中都使用它。我就是这样做的:
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();
});
}
在发布后的同一时间阅读了这个问题后,我决定发布另一个解决方案,因为我觉得它不太令人满意,至少不符合我的需要: 我用过这样的方法:
var currentDate= new Date().setHours(0,0,0,0);
var startDay = new Date(currentDate - 86400000 * 2);
var finalDay = new Date(currentDate + 86400000 * 2);
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
这样的话,我就可以用我想要的格式来处理这些日期了。但这只是出于我的需要,但我还是决定发布它,也许它会对某人有所帮助,因为我在这里没有看到类似的方法,我不喜欢将h/m/s/ms设置为0,因为它可能会导致使用更改的
日期对象(我想是这样)准确转换到本地时区的问题,让我在这里介绍一下,不久前写的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)
用于小于或等于检查
此外,显然,您可以在不同的位置切换date1
和date2
,以实现任何其他简单的比较。这如何
Date.prototype.withoutTime = function () {
var d = new Date(this);
d.setHours(0, 0, 0, 0);
return d;
}
它允许您像这样比较日期的日期部分,而不影响变量的值:
var date1 = new Date(2014,1,1);
new Date().withoutTime() > date1.withoutTime(); // true
你可以用一些算术来计算ms的总数
var date = new Date(date1);
date.setHours(0, 0, 0, 0);
var diff = date2.getTime() - date.getTime();
return diff >= 0 && diff < 86400000;
var-date=新日期(date1);
设置时间(0,0,0,0);
var diff=date2.getTime()-date.getTime();
返回差值>=0&&diff<86400000;
我喜欢这样,因为没有对原始日期进行更新,而且比字符串拆分和比较更快
希望这有帮助 注意时区
使用date对象直接表示一个日期会使您陷入一个严重的精度过高问题。你需要管理时间和时区来阻止他们进入,他们可以在任何时候偷偷溜回来这个问题的公认答案落入陷阱。
javascript日期没有时区的概念。这是一个瞬间(从纪元开始的滴答声),具有方便的(静态)功能,用于在字符串之间进行转换,默认情况下使用设备的“本地”时区,或者,如果指定,使用UTC或其他时区。只代表一次约会™ 对于日期对象,您希望您的日期在相关日期开始时代表UTC午夜。这是一种常见且必要的约定,允许您处理日期,而不管创建日期的季节或时区。因此,无论是在创建UTC Date对象时还是在序列化它时,都需要非常警惕地管理时区的概念
许多人对控制台的默认行为感到困惑。如果您向控制台喷洒日期,您看到的输出将包括您的时区。这只是因为控制台在您的日期调用了toString()
,而toString()
为您提供了一个本地表示。基础日期没有时区!(只要时间与时区偏移相匹配,您仍然拥有午夜UTC日期对象)
反序列化(或创建UTC日期对象)
这是四舍五入步骤,技巧是有两个“正确”答案。大多数情况下,您希望您的日期反映用户的本地时区我在这里的日期是什么时候。。新西兰和美国的用户可以同时点击,通常会得到不同的日期。在这种情况下,请这样做
// 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.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));
var midnightUTCDate = new Date( dateString + 'T00:00:00Z');
有时,国际可比性胜过地方准确性。在这种情况下,请这样做
// 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.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));
var midnightUTCDate = new Date( dateString + 'T00:00:00Z');
反序列化日期
连线上的日期通常采用YYYY-MM-DD格式。要反序列化日期,请执行以下操作
// 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.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));
var midnightUTCDate = new Date( dateString + 'T00:00:00Z');
序列化
在创建时注意管理时区,现在需要确保在转换回字符串表示形式时不使用时区这样您就可以安全地使用…
toISOString()
getUTCxxx()
getTime()//返回一个没有时间或时区的数字。
.toLocaleDateString(“fr”,{时区:“UTC”})/
> date1;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300
> date2;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300
> date1 == date2;
outputs: false
> Math.floor(date1.getTime() / 86400000) == Math.floor(date2.getTime() / 86400000);
outputs: true
var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())
var d1 = new Date();
var d2 = new Date("2019-2-23");
if(d1.setHours(0,0,0,0) == d2.setHours(0,0,0,0)){
console.log(true)
}else{
console.log(false)
}
var fromdate = new Date(MM/DD/YYYY);
var todate = new Date(MM/DD/YYYY);
if (fromdate > todate){
console.log('False');
}else{
console.log('True');
}
var newfromdate = new Date(moment(fromdate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newfromdate);
var newtodate = new Date(moment(todate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newtodate);
> "2019-04-22" <= "2019-04-23"
true
> "2019-04-22" <= "2019-04-22"
true
> "2019-04-22" <= "2019-04-21"
false
> "2019-04-22" === "2019-04-22"
true
> new Date().toISOString().split("T")[0]
"2019-04-22"
var d1 = new Date(2019,01,01,1,20)
var d2 = new Date(2019,01,01,2,20)
console.log(d1==d2) // false
console.log(d1.toDateString() == d2.toDateString()) // true
export default (chosenDate) => {
const now = new Date();
const today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
const splitChosenDate = chosenDate.split('/');
today.setHours(0, 0, 0, 0);
const fromDate = today.getTime();
const toDate = new Date(splitChosenDate[2], splitChosenDate[1] - 1, splitChosenDate[0]).getTime();
return toDate < fromDate;
};