2015-03-25 45 views
0

我的表單有一個Kendo DatePicker和一個在執行form.submit()之前運行JavaScript函數的按鈕。我需要能夠比較我輸入的日期和下限,並且如果代碼早於我的設置日期,則會阻止代碼繼續(提交表單)。如果限制沒有被違反,我想返回false,如果有限制,則返回true。我會用這個例子來說明什麼,我試圖驗證碼做:Moment.js - 日期比較:捕捉最小範圍

var lowerBound = new Date('1776', '6','4'); // July 4, 1776 
var dateField = $('#myDateField').val(); // <-- comes from Kendo DatePicker 
var dateToConsider = new Date(dateField); // if this is 1/1/0001, this changes to 1/1/1901... not good, so I do this, instead.... 

var arrDate = dateField.split('/'); // I also check for '-', ' ', and '.' 
dateToConsider = arrDate[2] + '-' + arrDate[0] + '-' arrDate[1]; // could add 'T00:00:00Z'; but don't think it matters 

var momentDTC = moment(dateToConsider); 
var lowerLimitBreached = moment(lowerBound).isAfter(momentDTC); // <-- this is always false 

if (!lowerLimitBreached) 
    $('form').submit(); 

我已經輸入1/1/0001到控制,並不斷給lowerLimitBreached爲假,當這應該是真的,因爲1-1-0001顯然早於7-4-1776 ...我試過使用.isBefore(),但遇到同樣的問題,並且文檔實際上說NOTE: moment().isBefore() has undefined behavior and should not be used!,所以我不敢使用它。

瞬間文檔:http://momentjs.com/docs/#/query/

回答

0

由於您使用moment.js,完全不使用JavaScript Date對象。只堅持時刻對象。

//evaluates correctly 
moment('0001-01-01'); 

//evaluates to Feb 2, 0001 - makes no sense... 
new Date(Date.parse('0001-02-03')) 
          //^ but that's a 3, not a 2 

//true - Jan 1, 0001 is before June 4, 1776 
moment('0001-01-01').diff(moment('1776-06-04')) < 0 

所以,看你的代碼,嘗試了這一點:

var lowerBound = moment('1776-06-04'); 
var dateField = $('#myDateField').val(); 

// String replace and put in proper format for moment 
dateField = dateField.replace(/(\/)/g,'-'); 
var year = dateField.split('-')[2]; 
var month = dateField.split('-')[0]; 
var day = dateField.split('-')[1]; 

if (month < 10) { month = "0" + month; } 
if (day < 10) { day = "0" + day; } 
dateField = year + '-' + month + '-' + day; 

// Enter into moment and compare 
var dateToConsider = moment(dateField); 
var lowerLimitBreached = dateToConsider.diff(lowerBound) < 0; 

if (lowerLimitBreached) 
    $('form').submit(); 
+0

「由於您使用的那一刻,不使用JavaScript Date對象都」 ---你不需要用時間來比較兩個日期。 – zerkms 2015-03-25 01:36:29

+1

雖然這不是OP的問題嗎? – ThisClark 2015-03-25 01:37:25

+1

它是。 OP沒有說明解決方案必須是基於特定的時刻。 – zerkms 2015-03-25 01:37:59

-1

你爲什麼不這樣做呢?

var lowerBound = moment('1776-6-4'); 
var dateField = moment($('#myDateField').val()); 
var lowerLimitBreached = moment(lowerBound).isAfter(dateField); 

if (!lowerLimitBreached) 
    $('form').submit(); 

您已經在使用的時刻,只是轉換劍道選擇器的日期片刻對象,並用isAfterisBefore

如果這不起作用,請提供一個日期的選擇器可能返回的工作不適合你

+1

我認爲在這一點上#myDateField值是1/1/0001,所以我們需要做一些關於這個問題。在瞬間或Date構造函數中,兩者都評估爲1901. – ThisClark 2015-03-25 01:57:59

+0

是的,我已經試過這個,它總是假的。 – vapcguy 2015-03-25 02:02:26

+0

瞬間會告訴你它是否無法解析日期。這可能是因爲你需要在第二個時刻包含格式字符串。揀貨員的價值是什麼回報爲 – Eonasdan 2015-03-25 02:04:03