2012-11-16 273 views
1

問題聲明: 我必須驗證具有字段「開始日期」和「結束日期」的表單。在javascript中找到兩個日期時間之間的差異

驗證約束: 這兩個日期之間的差異不得少於24小時。

實施例: 無效情況下: SDATE: 「2012年1月10日11:59」 EDATE: 「」 2012年2月10日00:00"

SDATE:「2012年1月10日02 :20" EDATE: 「」 2012年2月10日02:00"

有效案例:

SDATE: 「2012年1月10日02:20」 EDATE: 「」 2012年2月10日03:30「

注意:這兩個日期對象s也有時間價值。

+0

是那些日期12小時或相隔1個月;-) – Alnitak

+0

dd-mm -yyyy dd是部分差異,這使得亞認爲它是一天的差異,但時間使得它不到一天相差 – Zohaib

+0

是的,我想他們是dd-mm-yyyy。問題是這不是一個國際公認的格式。在美國,他們認爲是mm-dd-yyyy。最好的格式是ISO8601,它使用yyyy-mm-dd。 – Alnitak

回答

1

一旦你已經解析了2串並建立了相應的Date對象,你只需要使用:

function isValid(startDate, endDate) { 
    return endDate - startDate > 24 * 60 * 60 * 1000; 
} 
+0

新日期(「01-10-2012 05:30」)給出無效日期對象getTime()是NaN – Zohaib

+0

是的,當你使用'new Date(dateAsString)'或'Date.parse(dateAsString)'* dateAsString *必須表示爲RFC2822或ISO 8601日期。這就是爲什麼我用*開始答案一旦你解析了2個字符串並創建了相應的Date * –

+1

@AlexandreArdhuin,就不需要調用getTime() - 當你調用時,JS會自動調用'.valueOf()'在'日期'上使用數學運算來做同樣的事情。 – Alnitak

1

看一看moment.js。它幾乎可以肯定你想要的。

0
 function(start, end, unit){ 
      var denom = 1, 
       diff = end.getTime() - start.getTime(); 

      if(unit == 's'){ 
       denom = 1000; 
      } 
      else if(unit == 'm'){ 
       denom = 1000*60; 
      } 
      else if(unit == 'h'){ 
       denom = 1000*60*60; 
      } 
      return Math.round(diff/denom); 
     } 

單位可以's' - 秒,'米' - 分鐘,'h' - 天。您可以根據自己的選擇來擴展它:天,月等。

您還應該首先解析您的日期至javascript Date對象。你需要幫助嗎?從您的格式

日期解析:

var p = "01-10-2012 05:30".match(/(\d{2})-(\d{2})-(\d{4}) (\d{2}):(\d{2})/); 
parsedDate = new Date(parseInt(p[3]) - 1900, parseInt(p[2]) - 1, p[1], p[4], p[5]); 
+0

是的,我做了以下解析日期對象: 新日期(「01-10-2012 05:30」)給無效日期對象getTime()是NaN – Zohaib

+1

更新我的回答 –

+2

@VyacheslavVoronchuk並非所有瀏覽器支持ISO8601格式。唯一普遍支持的格式AFAIK是RFC2822格式,因此IME最好解構字符串(就像你一樣),然後使用帶六個獨立字段的構造函數。 – Alnitak

0

你可以使用這個來計算的差異和執行您的驗證:

Date.daysBetween = function(date1, date2) { 
    //Get 1 day in milliseconds 
    var one_day=1000*60*60*24; 

    // Convert both dates to milliseconds 
    var date1_ms = date1.getTime(); 
    var date2_ms = date2.getTime(); 

    // Calculate the difference in milliseconds 
    var difference_ms = date2_ms - date1_ms; 
    //take out milliseconds 
    difference_ms = difference_ms/1000; 
    var seconds = Math.floor(difference_ms % 60); 
    difference_ms = difference_ms/60; 
    var minutes = Math.floor(difference_ms % 60); 
    difference_ms = difference_ms/60; 
    var hours = Math.floor(difference_ms % 24); 
    var days = Math.floor(difference_ms/24); 

    return days + ' days, ' + hours + ' hours, ' + minutes + ' minutes, and ' + seconds + ' seconds'; 
} 
+1

這是複雜的 - 他只是想知道它是否超過24小時,而不是多少。 – Alnitak

+0

這顯示瞭如何在不同單位獲得差異,他不需要全部使用它們,只需使用幾小時的差異並進行驗證。 – 03Usr

+0

如果您有兩個日期對象,則所需的測試是_one liner_。 – Alnitak

0

難的部分是將字符串轉換爲有效的Date對象,特別是因爲您使用的是非標準日期格式。

我會建議使用可以應付該格式的第三方庫,或使用簡單的字符串操作,並使用構造函數Data的構造函數的版本,其中每個(年,月,日期,小時,分鐘,秒)

這樣做後,測試兩個JavaScript對象是否相距超過24小時是很容易的 - 只需取其數值並檢查它是否超過86400000(一天中的毫秒數)。

var t1 = new Date(Y1, M1, D1, hh1, mm1, ss1); 
var t2 = new Date(Y2, M2, D2, hh2, mm2, ss2); 

var valid = (t2 - t1) >= 86400000; 
0
/** Method: getDateObject 
    * 
    * Description: 
    * gives date object from string 
    * @param dateString 
    * @param separator used 
    * @returns corresponding date object 
    */ 

function getDateObject(dateString, parseFormat) { 
//This function return a date object after accepting 

if(dateString!=null && dateString!=undefined && dateString!="") 
{ 
    var dateFormat = sessvars.currentUser.options.dateFormat; 
    if(parseFormat.length==0) 
     parseFormat = [dateFormat + " HH:mm:ss", dateFormat + " HH:mm",dateFormat]; 

    var dtObject = Date.parseExact(dateString, parseFormat); 
    return dtObject; 
} 
else 
    return dateString; 
} 

好感謝名單了很多人對您的寶貴意見和建議。我已經有了一個使用你的想法混合的解決方案。

解決方案:

1。根據指定的格式製作一個自定義函數,返回日期對象。

2.現在getTime()會給出毫秒值。

3.SDate.getTime() - EDate.getTime()< 24 * 3600 * 1000

實施例:

getDateObject( 「2012年1月10日05:30」,[])。 getTime() - getDateObject(「02-10-2012 05:30」,[])。getTime()< 24 * 3600 * 1000