2012-06-21 251 views
0

有没有更好的方式来格式化用户推测的日期。我有一个输入栏,当点击一个日历时弹出,你可以选择一个日期,但用户也可以选择输入日期。我希望用户能够输入1/12,并且我的JavaScript将其格式化为01/12/2012。有没有一种简单的方法可以解决这个问题,而无需执行所有类型的检查?如果不是什么是最好的方式去做这件事?格式化用户输入日期。

+0

它的mm/dd/yyyy。 –

+0

我只是想出了一个很好的小修补程序,稍后我会在这里发布。 –

回答

3

我刚刚试了一下,但不知道它是否正确的方法,但我认为它的工作(月/日/年)。

$('input[name="txt_date"]').on('blur', function(e){ 
    var dt=$(this).val(); 
    if(dt!='') 
    { 
     if(dt.indexOf('/')) 
     { 
      var da=dt.split('/'); 
      var l=da.length; 
      if(l <= 3) 
      { 
       var date=''; 
       for(i=0;i<l;i++) 
       { 
        if(i==0) 
        { 
         if(da[i].match(/^\d{1}|d{2}$/) && da[i]>0 && da[i]<=12) 
         { 
          var m=da[i].length==1 ? '0'+da[i] : da[i]; 
          date=m; 
         } 
        } 
        if(i==1) 
        { 
         if(da[i].match(/^\d{1}|d{2}$/) && da[i]>0 && da[i]<=31) 
         { 
          var d=da[i].length==1 ? '0'+da[i] : da[i]; 
          date+='/'+d; 
         } 
        } 
        if(i==2) 
        { 
         if(da[i].match(/^\d{4}$/)) 
         { 
          date+='/'+da[i]; 
         } 
         else date+='/'+new Date().getFullYear(); 
        } 
       } 
       if(l<3) 
       { 
        date+='/'+new Date().getFullYear(); 
       } 
       if(date.match(/^\d{2}\/\d{2}\/\d{4}$/)) 
       { 
        $(this).val(date); 
       } 
       else alert('invalid date!'); 
      } 
     } 
    } 
}); 

DEMO.

+0

'for'循环在开始的时候有点令人困惑 - 很好的技巧,但我更喜欢没有'for'的代码,'if(i == 0)'和'if(i == 1)'+ replace if (i == 2)'if'(l === 3)'+用'else'替换if(l <3)'' – Aprillion

+0

感谢您抽出时间写出来。我喜欢这种方式,但觉得它与正则表达式有点难以理解。 –

+0

我结束了使用这一些。修改它有点但是是.. –

3

这个库可以帮助你:http://www.datejs.com/

DD/MM/YYYY是例如有效的格式在西班牙,英国,...

+1

datejs多年未更新。我发现http://momentjs.com/是一个更清洁和更新的实现。 – mbarrows

1

这是我想出了。

var checkDate = function(dateVal, input){ 

      if(dateVal.length == 10){ 
       return; 
      } 
      var d = new Date(); 
      var currentMonth = d.getMonth(); 
      var year = d.getFullYear(); 
      var firstIndex = dateVal.indexOf('/'); 
      var month = parseInt(dateVal.substr(0, firstIndex)); 
      var day = parseInt(dateVal.substr(firstIndex + 1, 2)); 

      if(month < 10){ 
       month = '0' + month; 
      } 

      if(day < 10){ 
       day = '0' + day; 
      } 

      if(month > currentMonth){ 
       year = year - 1; 
      } 

      dateVal = month + '/' + day + '/' + year; 

      if(isNaN(month)){ 
       input.val(''); 
       return; 
      } 
      input.val(dateVal); 

     }; 
+0

我更喜欢Sheikh Heera的回答,但是如果这样能够捕捉到所有你想要的情况,那么这是一种可行的方式 – Aprillion

+0

我向它添加了几个小检查来使它合法化,但它现在完成了我现在需要的一切。我也喜欢sheikh-heera的回答,但真的觉得这种方式是不可读的。 –