2013-02-12 26 views
2

我從輸入中得到了一個startdate和enddate。我需要將從startdate到enddate的所有日期放入數據庫。因此,我需要做一個這樣的循環:從javascript輸入從startdate到enddate的循環

FOR i = startdate; i <= enddate; i + 1 day 
{ 
    here i use the date 
} 

如何使用輸入框中的日期做出這樣的循環?

我得到「無效的日期」如果我嘗試這樣做:

var endDate = new Date($("#enddate").val()); 

我不能使用endDate.getTime()就像我需要你的答案說,如果我這樣做喜歡這個。

var endDate = $("#enddate").val()); 
var endDateTime = endDate.getTime(); 

所以基本上:我怎麼能輸入轉換爲日期? enddate的輸入如下所示:dd/mm/yyyy。

不,這不是一個SQL問題,我需要這樣做是因爲我需要首先檢查日期。

謝謝你幫助我;)

+1

任何變化,你可以在SQL做到這一點,而不是一個JavaScript的循環?它很可能會更快。假設你的問題,我明白你正在插入多個記錄完全基於日期。 – Leeish 2013-02-12 20:37:31

+0

你在用什麼數據庫? – Samuel 2013-02-12 20:39:36

+0

這是一個JavaScript或SQL問題? – Bergi 2013-02-12 20:44:47

回答

2

會喜歡這個工作?:

var current_date = new Date("01/13/2013"); 
var end_date = new Date("01/20/2013"); 
var end_date_time = end_date.getTime(); 

while (current_date.getTime() < end_date_time) { 
    console.log(current_date); 
    current_date.setDate(current_date.getDate()+1); 
} 

http://jsfiddle.net/Sn6Ws/

根據您的文本框值的格式一環,你可以將它設置像這樣:

$(document).ready(function() { 
    $("#btn").on("click", function() { 
     dateLooper(function (cur, end) { 
      console.log("Current date: " + cur.toString() + ", End Date: " + end.toString()); 
     }); 
    }); 
}); 

function dateLooper(callback) { 
    var start_date_text = document.getElementById("start_date").value; 
    var end_date_text = document.getElementById("end_date").value; 

    var current_date = new Date(start_date_text); 
    var end_date = new Date(end_date_text); 
    var end_date_time = end_date.getTime(); 

    while (current_date.getTime() < end_date_time) { 
     //console.log(current_date); 
     callback.call(this, current_date, end_date); 
     current_date.setDate(current_date.getDate()+1); 
    } 
} 

http://jsfiddle.net/Sn6Ws/1/

根據您的意見解釋日期的格式爲「DD/MM/YYYY」,你可以使用這樣的事情:

var start_date_text = document.getElementById("start_date").value; 
var start_split = start_date_text.split("/"); 
if (start_split.length != 3) { 
    return false; 
} 
start_date_text = start_split[1] + "/" + start_split[0] + "/" + start_split[2]; 

var end_date_text = document.getElementById("end_date").value; 
var end_split = end_date_text.split("/"); 
if (end_split.length != 3) { 
    return false; 
} 
end_date_text = end_split[1] + "/" + end_split[0] + "/" + end_split[2]; 

它們傳遞給new Date之前得到正確的格式的日期。這裏有一個更新的jsfiddle演示它:

http://jsfiddle.net/Sn6Ws/4/

當然,要小心,如果日期不具有指定格式進來(在情況下,用戶可以在什麼鍵入此),代碼將最有可能拋出一個錯誤。在進行某些操作之前(比如確保每個項目是一個數字/整數,確保天數在1到31之間等等),顯然可以進行更多檢查以確保設置了某些內容。所以出於這個原因,你可能想要走正則表達式的路線。至少在正則表達式中,您可以指定特定的模式並知道它是否完美匹配,並立即獲取構建日期所需的值。

使用正則表達式,下面的是不完整的,但應該有希望幫助一個例子:

function dateLooper(callback) { 
    var re = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/; 

    var start_date_text = document.getElementById("start_date").value; 
    var start_match = re.exec(start_date_text); 
    if (start_match) { 
     var valid = true; 
     // Set `valid` variable based on the following 
     // Validate start_match[1] is valid day 
     // Validate start_match[2] is valid month 
     // Validate start_match[3] is valid year 
     if (valid) { 
      start_date_text = combineDate(start_match); 
     } else { 
      return false; 
     } 
    } else { 
     return false; 
    } 

    var end_date_text = document.getElementById("end_date").value; 
    var end_match = re.exec(end_date_text); 
    if (end_match) { 
     var valid = true; 
     // Set `valid` variable based on the following 
     // Validate end_match[1] is valid day 
     // Validate end_match[2] is valid month 
     // Validate end_match[3] is valid year 
     if (valid) { 
      end_date_text = combineDate(end_match); 
     } else { 
      return false; 
     } 
    } else { 
     return false; 
    } 

    var current_date = new Date(start_date_text); 
    var end_date = new Date(end_date_text); 
    var end_date_time = end_date.getTime(); 
    var days_spent = 0; 

    while (current_date.getTime() < end_date_time) { 
     days_spent++; 
     callback.call(this, current_date, end_date, days_spent); 
     current_date.setDate(current_date.getDate()+1); 
    } 

    return days_spent; 
} 

function combineDate(re_match) { 
    return re_match[2] + "/" + re_match[1] + "/" + re_match[3]; 
} 

http://jsfiddle.net/Sn6Ws/6/

+0

我可以完全使用while循環,但它不起作用,因爲我無法將輸入值轉換爲日期格式。如果你知道答案,你可以編輯你的代碼嗎? – Lewis 2013-02-13 18:52:45

+0

@ user2066100我用一些解釋更新了我的答案。試試最後一個例子,讓我知道如果這有幫助 – Ian 2013-02-13 19:19:30

+0

分組幫助我把它作爲日期格式。已經有了驗證。但是,謝謝。 – Lewis 2013-02-13 22:53:19

相關問題