2012-11-16 272 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