2013-05-03 197 views
0

我有這兩個var的curdate和sdate ... sdate是有人輸入的標準字符串,然後它與curdate進行比較。 curdate是一個來自smarty模板的日期字段(以mm/dd/yyyy格式顯示今天的日期)將JavaScript字符串轉換爲日期

我需要將sdate轉換爲相同類型格式,才能將其與curdate進行比較,因此某人不會輸入類似jan /12/2013...不會匹配,並會向他們顯示此消息。

if(sdate > curdate){ 
    var d= confirm("The date you selected: " + sdate + " is in the future, OK to continue?"); 
    if(!d) return false; 
} 
+0

不能解決我遇到的問題。 – Lynx 2013-05-03 13:46:38

+0

「curdate」是什麼格式?這是一個時間戳,不是嗎? – Bergi 2013-05-03 14:29:55

回答

1

可以「限制」什麼客戶端輸入將使用JavaScript,以便確保將所輸入的數據是數字,例如。使用該數字輸入,您可以非常容易地以所需格式構建字符串。
我已經設置了this fiddle,幾乎和下面的代碼一樣。小提琴也會進行一些基本檢查(比如不接受日期à33/54/1001),並且也解析日期。輸入完整日期後,點擊按鈕並檢查控制檯中的輸出:它是一個普通的日期對象,可以與另一個日期對象進行比較(如今天:curdate = new Date();)。
但爲了讓你上手,這裏的按鍵處理程序的簡化版本,與用戶輸入的交易:

var keypress = function(e) 
{ 
    e = e || window.event;//FROM HERE 
    var el = e.target || e.srcElement, 
    char = String.fromCharCode(e.keyCode || e.which); 
    e.returnValue = false; 
    e.cancelBubble = true; 
    if (e.preventDefault) 
    { 
     e.preventDefault(); 
     e.stopPropagation(); 
    }//TO HERE, a lot of X-browser issues are adressed 
    if (char == +(char) && el.value.length < 10) 
    {//format input: 
     el.value = (el.value + char).replace(/^([0-9]{0,2})\/*([0-9]{0,2})\/*([0-9]{0,4})$/,function(all, m, d, y) 
     { 
      m += m.length === 2 ? '/' : ''; 
      d += d.length === 2 ? '/' : ''; 
      return m+d+y; 
     }); 
    } 
    return e;//done 
}; 
var dateIn = document.getElementById('dateInputElement'); 
if (dateIn.addEventListener) 
{//add event handlers 
    dateIn.addEventListener('keypress',keypress, false); 
} 
else 
{ 
    return dateIn.attachEvent('onkeypress',keypress); 
} 

爲了更好地瞭解這段代碼的,你可能想看看herehere

+0

如果每個按鍵都被阻止,我該如何在輸入中輸入任何內容?永遠不要限制打字,但在提交之前驗證(也許活着,但不顯眼) – Bergi 2013-05-03 14:28:23

+0

@Bergi:這不是最便於用戶使用的方法,但是您可以通過任何方式在該輸入字段中鍵入。儘管每個非數字字符都會被忽略。 – 2013-05-03 14:29:57

+0

呃,但是你必須以'0'或'1'開始,因爲沒有在你的臉上發出警報:-)至少不好的做法是設置一個不作爲輸入的輸入,但檢測到擊鍵並手動追加它們到它的價值。您無法更正任何內容,並且不尊重鼠標事件(複製,粘貼,移動選擇)。我會稱它爲用戶 - *不友好* ... – Bergi 2013-05-03 14:39:06

1

您可以使用像Date.js這樣的庫來將用戶輸入的字符串和其他類似日期的值解析爲已知格式。然後直接比較。

if (Date.parse(sdate) > Date.parse(curdate)) { 
    ... 
} 
+1

直到Date.js團隊可以[得到](https://groups.google.com/d/msg/datejs/U7W2DtwzMA8/jAx6IvwQZ2oJ)[他們](https://groups.google.com/d/msg/datejs/vTRd7yDX5Lg/lt5ajP9l3VgJ)[act](https://code.google.com/p/datejs/issues)[together] (https://code.google.com/p/datejs/source/list)並生成穩定版本,我不會推薦使用它。改爲嘗試[moment.js](http://momentjs.com/)。 – 2013-05-03 14:49:38

+0

@Matt酷!我沒有聽說過moment.js。 OP,我還建議繼續這樣做,因爲它似乎處於積極的發展階段,並且Date.js自2007年以來沒有看到過活動? – Dihedral 2013-05-03 14:57:17

+0

Date.js在2008年有一些代碼活動,並在2009年和2010年有一些文檔更新,但有125個未解決的問題,並仍在2007年發佈的「Alpha-1」。 – 2013-05-03 14:59:29

1

使用moment.js,你可以做這樣的事情:

if (moment(sdate, 'MM/DD/YYYY') > moment(curdate)) 
... 

如果你是說curdate是代表 「現在」,那麼就這樣做:

if (moment(sdate, 'MM/DD/YYYY') > moment()) 
... 

如果你想確保日期處於特定格式,您可以使用它們的validation功能:

if (moment(sdate, 'MM/DD/YYYY').isValid()) 
... 
+0

對不起,我評論過快,忽略了'。 isValid'位(好吧,我忽略了它)。這是通過格式化來解決OP的問題...評論現在已經消失了:P – 2013-05-03 14:58:37