2014-01-06 2 views
0

Я довольно новичок в JavaScript, и я много экспериментирую, чтобы привыкнуть к нему. Я пытаюсь написать функцию JavaScript, которая определяет, является ли дата из прошлого или будущего. Он использовал форму datepicker, и как-то оператор if работает некорректно, потому что в любой выбранной мне даты отображается «Дата из будущего».Сравнение дат в JavaScript

function selectDate() 
{ 
    var d = new Date(); 
    var day = d.getDate(); 
    var month = (d.getMonth() +1); 
    var year = d.getFullYear(); 
    var x=document.getElementById("dateSelection"); 

if (month.length < 2) month = '0' + month; 
    if (day.length < 2) day = '0' + day; 

if (d > x) 
{ 
    document.write("Date from the past" + "<br>"); 
    document.write("Today is " +day+ "/" +month+ "/" +year+ ""); 
} 
else (d < x) 
{ 
    document.write("Date from the future" + "<br>"); 
    document.write("Today is " +day+ "/" +month+ "/" +year+ ""); 
} 
+2

JS объекты даты можно сравнивать напрямую. 'if (date_object_from_picker

+0

, можете ли вы привести пример? довольно новичок в этом. заранее спасибо – Raikonne

ответ

0

Самый простой способ сделать это простым сопоставлением объектов объекта с использованием стандартных < и > операторов. Однако есть несколько трюков. , ,

Во-первых, инициализировать «текущую дату»:

var d = new Date(); 

проблема в том, что на самом деле является текущая дата/время, а не только текущая дата, так что любая дата вводится в том, что равняется сегодняшнего дата будет выдавать ложную «меньше» (если вы не проверите на точно полночь;)). Итак, вам нужно «обнулить» значения времени в значении d:

d.setHours(0, 0, 0, 0); 

Теперь вы создаете объект Date из пользовательского ввода:

var x = new Date(document.getElementById("dateSelection")); 

Поскольку вход является строка даты , (1) конструктор Date знает, как обрабатывать форматированное значение даты, поэтому вам не нужно вносить какие-либо изменения в отдельные значения месяца/дня/года и (2) в строке ввода нет элементов времени, так что вам не нужно беспокоиться об обнулении их, как вы делаете с текущей датой.

Примечание 1: вам необходимо знать о локальном форматировании даты. , , конструктор Date распознает формат «mm/dd/yyyy» в качестве входного сигнала, но будет смущен форматом «dd/mm/yyyy». Если вам нужно обрабатывать этот формат, вам может потребоваться дополнительная обработка.

Примечание 2: есть чеки, которые вы должны сделать здесь, чтобы убедиться, что значение, которое вы получаете, является форматированной строкой даты, но это должно произойти в более раннем коде, прежде чем ваш код когда-либо попытается обработать Значение.

После того, как вы получили два Date объекты, это только простое сравнение

if (d > x) { 
    // ** the user-entered date is in the past ** 
} 
else if (d < x) { 
    // ** the user-entered date is in the future ** 
} 
else { 
    // ** the user-entered date is the current date ** 
} 
+0

Спасибо очень очень простой способ сделать это. Однако по-прежнему появляется ошибка, возможно, из-за формата.знаете ли вы какой-либо простой способ изменения формата dd/mm/yyyy? спасибо – Raikonne

+0

Вместо того, чтобы изменять формат ввода пользователя, я бы предложил поставить проверку в поле, чтобы убедиться, что вход находится в правильном формате, прежде чем он будет обработан. Основная причина этого заключается в том, что у вас нет другого способа контролировать, какую ценность вводит пользователь. Если вы убедитесь, что пользователь ввел значение, соответствующее тому формату, который вам нужен для вашего кода, вам не придется беспокоиться о том, как манипулировать их данными, чтобы заставить его работать. – talemyn

1

Вы сравниваете строку x против даты объекта d, это не может быть сделано.

Для сравнения дат, то лучше сравнивать Date объектов, вы можете сделать:

function selectDate() 
{ 
    var d = new Date(); 
    var day = d.getDate(); 
    var month = (d.getMonth() +1); 
    var year = d.getFullYear(); 
    var x = document.getElementById("dateSelection"); //This is a STRING, not a Date 

    var dateParts = x.split("/"); //Will split in 3 parts: day, month and year 
    var xday = dateParts[0]; 
    var xmonth = dateParts[1]; 
    var xyear = dateParts[2]; 

    //Now create date object of the selected one 
    var xd = new Date(xyear, parseInt(xmonth, 10) -1, xday); 


    if (d > xd) //Now we compare 2 date objects 
    { 
     document.write("Date from the past" + "<br>"); 
     document.write("Today is " +day+ "/" +month+ "/" +year+ ""); 
    } 
    else (d < xd) 
    { 
     document.write("Date from the future" + "<br>"); 
     document.write("Today is " +day+ "/" +month+ "/" +year+ ""); 
    } 
} 

Надеется, что это помогает. Cheers