2013-05-03 196 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