首页 文章

仅比较日期部分而不比较JavaScript中的时间

提问于
浏览
296

下面的代码有什么问题?

也许比较日期而不是时间会更简单 . 我不知道怎么做,我搜索,但我找不到我的确切问题 .

顺便说一句,当我在警报中显示两个日期时,它们显示完全相同 .

我的代码:

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

是否有更简单的方法来比较日期而不包括时间?

15 回答

  • 0

    我发现哪个对我来说比较两个日期没有时间是使用Date对象的setHours方法并将小时,分钟,秒和毫秒设置为零 . 然后比较两个日期 .

    例如,

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

    date2 将设置为小时,分钟,秒和毫秒为零,但date1将它们设置为创建date1的时间 . 要消除date1上的小时,分钟,秒和毫秒,请执行以下操作:

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

    现在,您只需将两个日期作为日期进行比较,而无需担心时间元素 .

  • 5

    这个怎么样?

    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
    
  • 47

    请注意时区

    使用日期对象直接表示只是一个日期会让你陷入一个巨大的超额精度问题 . 您需要管理时间和时区以防止它们出现,并且他们可以在任何步骤中潜入 . The accepted answer to this question falls into the trap.

    javascript日期没有时区概念 . 它是一个时刻(自纪元以来的刻度),使用方便的(静态)函数进行字符串转换,使用设备的"local"时区,或者,如果指定,则使用UTC . 要使用日期对象表示日期, you want your dates to represent UTC midnight at the start of the date in question. 这是一种常见且必要的约定,可让您使用日期而不管其创建的季节或时区 . 因此,在创建午夜UTC日期对象以及序列化时,您需要非常警惕地管理时区的概念 .

    Deserializing (or creating midnight UTC Date objects)

    大多数情况下,您希望您的日期反映用户的时区 . Click if today is your birthday . 新西兰和美国的用户同时点击并获得不同的日期 . 在这种情况下,这样做......

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

    Deserialize a date

    通常,电线上的日期将采用YYYY-MM-DD格式 . 要反序列化它们,请执行此操作...

    var midnightUTCDate = new Date( dateString + 'T00:00:00Z');
    

    Serializing

    在创建时注意管理时区,现在需要确保在转换回字符串表示时保留时区 . So you can safely use...

    • toISOString()

    • getUTCxxx()

    • getTime() //returns a number with no time or timezone.

    • .toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.

    And totally avoid everything else, especially...

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

    See it running...

  • 1

    使用Moment.js

    如果您可以选择包含第三方库,那么绝对值得一看Moment.js . 它使得 DateDateTime 更容易使用 .

    例如,查看一个日期是否在另一个日期之后,但不包括它们的时间,您将执行以下操作:

    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 中的任何一个 .

  • 1

    只需使用.toDateString进行比较,如下所示:

    new Date().toDateString();
    

    这将仅返回日期部分而不是时间或时区,如下所示:

    “2017年2月3日星期五”

    因此,两种日期都可以用这种格式进行比较,同时没有时间的一部分 .

  • 3

    这可能是一个更简洁的版本,还要注意在使用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页面以获取有关基数的更多信息 .

    JSLint是一个很棒的工具,用于捕捉丢失的基数和许多其他可能导致模糊和难以调试错误的事情 . 它迫使您使用更好的编码标准,以避免未来的头痛 . 我在我编写的每个JavaScript项目中使用它 .

  • 1

    date.js库对于这些东西很方便 . 它使所有JS日期相关的脚本更容易 .

  • 0

    这就是我这样做的方式:

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

    因为我不喜欢将h / m / s / ms设置为0,因为它可能导致准确转换到本地时区的问题与更改的 date 对象(我猜是这样),让我在这里介绍一下,写的不久前,lil功能:

    + :易于使用,使基本比较操作完成(比较没有时间的日,月和年) .
    - :看来这与"out of the box"思维完全相反 .

    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) 用于较少或相等的检查

    此外,显然,您可以在地方切换 date1date2 以实现任何其他简单比较 .

  • 1

    确保将 userDate 与4位数年份构建为 setFullYear(10, ...) !== setFullYear(2010, ...) .

  • 58

    在发布这个问题的同时,我已经决定发布另一个解决方案,因为我没有发现它非常令人满意,至少根据我的需要:

    我用过这样的东西:

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

    通过这种方式,我可以使用我想要的格式的日期进行处理 . 但这只是为了我的需要,但我决定发布它,也许它会帮助某人

  • 3

    您可以使用总计ms的一些算术运算 .

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

    我喜欢这个,因为没有对原始日期进行更新,并且比字符串拆分和比较更快 .

    希望这有帮助!

  • 8

    比较日期的有效且正确的方法是:

    Math.floor(date1.getTime() / 86400000) > Math.floor(date2.getTime() / 86400000);
    

    它忽略了时间部分,它适用于不同的时区,你也可以比较相等 == . 86400000是一天中的毫秒数( = 24*60*60*1000 ) .

    请注意,等于运算符 == 应该 never 用于比较Date对象,因为当你期望一个相等的测试工作因为它比较两个Date对象(并且不比较两个日期)时它会失败,例如:

    > 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
    

    注意:如果要比较时间部分设置为零的Date对象,则可以使用 date1.getTime() == date2.getTime() ,但几乎不值得进行优化 . 直接比较Date对象时,可以使用 <><=>= ,因为这些运算符首先通过在运算符进行比较之前调用 .valueOf() 来转换Date对象 .

  • 8

    我知道这个问题已经得到了解答,这可能不是最好的方法,但在我的场景中它的工作完美,所以我认为这可能会对像我这样的人有所帮助 .

    如果你有 date string

    String dateString="2018-01-01T18:19:12.543";
    

    并且您只想将日期部分与JS中的另一个Date对象进行比较,

    var anotherDate=new Date(); //some date
    

    那么你必须使用 new Date("2018-01-01T18:19:12.543");

    var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())
    

    stringDate 对象

    这是诀窍: -

    var valueDate =new Date(new Date(dateString).toDateString());
    
                return valueDate.valueOf() == anotherDate.valueOf(); //here is the final result
    

    我使用了JS的 Date objecttoDateString() ,它仅返回Date字符串 .

    注意:在比较日期时,不要忘记使用 .valueOf() 功能 .

    有关更多信息 .valeOf() 在这里reference

    快乐的编码 .

  • 647

    这会有所帮助 . 我设法得到这样的 .

    var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())
    

相关问题