2013-03-25 2 views
0
<script> 
    dfrom = datefrom.split("/"); 
    dto = dateto.split("/"); 

    //Checking Year Part; 
    if(parseInt(dfrom[2]) > parseInt(dto[2])){ 
     alert("DateFrom Cannot greater than DateTo"); 
     return false; 
    } 
    if((parseInt(dfrom[1]) > parseInt(dto[1])) && parseInt(dfrom[2]) == parseInt(dto[2])){ 
     alert("DateFrom Cannot greater than DateTo"); 
     return false; 
    } 
    if(parseInt(dfrom[0]) > parseInt(dto[0]) && (parseInt(dfrom[1]) == parseInt(dto[1])) && parseInt(dfrom[2]) == parseInt(dto[2])){ 
     alert("DateFrom Cannot greater than DateTo"); 
     return false; 
    } 
</script> 

Это мой код сценария для сравнения дат и работает нормально, но когда я проверяю 07/04/2013 и 08/04/2013, она показывает «DateFrom Может не больше, чем DateTo» и только эти даты показывают неправильный результат. Есть ли какая-либо ошибка в моем скрипте или что-то еще?Javascript: Даты сравнения

Любая помощь была бы очень заметна.

+2

Используйте библиотеку javascript. Это намного проще. – ahren

+0

use parseInt (что-то, 10), или строки '08' и '09' будут восьмеричными числами. – kennebec

+0

Код в письменном виде (полу) ерунда. У вас есть операторы return, но нет закрывающей функции. Даже добавляя правильную сантехнику (и никогда не использую parseInt без основания), код, похоже, работает с указанными датами, но потом снова кто знает, изменяю ли я код таким образом, который у вас не было ... – jmbucknall

ответ

1

попробовать это

dfrom = datefrom.split("/"); 
dto = dateto.split("/"); 


var x=new Date(); 
x.setFullYear(dfrom [2],dfrom [1]-1,dfrom [0]); 

var y=new Date(); 
y.setFullYear(dto [2],dto [1]-1,dto [0]); 


if (x>y) 
    { 
    alert("X is big "); 
    } 
else 
    { 
    alert("Y is big"); 
    } 

see here

+0

+1 для использования объектов Date, но нет необходимости создавать объект даты, а затем изменять значения, вы можете передать значения в конструктор и сохранить вызов шага и функции. – RobG

1

При интерпретации аргументов функции ParseInt, в старые браузеры будут использовать восьмеричную систему счисления (основание-8 системы нумерации) по умолчанию, когда строка начинается с «0» (например, '07', '08'). Начиная с ECMAScript 5, по умолчанию используется десятичное основание (10) (т. Е. Это сложно, но по крайней мере сейчас оно обесценивается).

Другими словами, существует вероятность, что если вы передадите строки («01») или числа (01), которые начинаются с 0 до parseInt без указания второго параметра (radix, что означает, какая система нумерации), они будут интерпретироваться как имеющее radix 8. Это означает, что 07 === 7 и 08, вероятно, имеет неопределенное поведение (0, «", неопределенное, кто знает?).

Чтобы обезопасить себя, всегда установить десятичную во втором параметре в ParseInt при работе с датами (я знаю, что я делаю), например ParseInt (х, 10) для регулярной основе 10.

Кстати, ведущие числа с 0 указывают на восьмеричные основания других языков, поэтому полезно избавиться от них при преобразовании строк в числа.

Удачи вам!

+0

Хотя вы правы в том, что ES5 меняет направление обработки нулей, не все браузеры еще не реализовали его (если есть). Октальное лечение не устарело *, оно удалено. – RobG

0

Самый простой способ сравнить строки даты - превратить их в объекты даты и сравнить их, поэтому, если ваши строки даты имеют формат d/m/y. вы можете сделать:

// s in format d/m/y 
// e.g. 15/3/2013 or 15/03/2013 
function toDate(s) { 
    var s = s.split('/'); 
    return new Date(s[2], --s[1], s[0]); 
} 

var d0 = '3/3/2013'; 
var d1 = '15/3/2013'; 

// Compare dates 
alert(toDate(d0) < toDate(d1)); // true 

alert(toDate(d1) < toDate(d0)); // false 

При использовании в сравнении или арифметической операции, дата объекты принуждают число, которое является их time value.