我有一个网站,用户可以在发送到服务器之前输入他们自己的日期。因此,我显然需要解析他们给我的内容,并在实际使用之前将其转换为标准格式。所以我使用了PHP的strtotime()函数,它非常宽容它将接受的输入。
但我也在网站上使用date.js,它的parse()函数也很不错。在将用户输入发送到服务器之前,我应该在用户输入上使用它吗?哪一个更好?
为了安全起见,我会在后端保留strtotime(),但如果date.js更好,我会将其添加到客户端。
(澄清一下,我期待的主要是美国日期格式。但如果这种情况发生变化,那么任何能够缓解这种过渡的东西都是首选。)
答案 0 :(得分:2)
只要您认为strtotime()
满足您的需求,就没有理由在客户端进行更改。但是,strtotime()
会做出一些假设,您需要保持最佳状态:
From the strtotime()
documentation:
通过查看各个组件之间的分隔符来消除m / d / y或d-m-y格式的日期:如果分隔符是斜杠(/),则假设为美国m / d / y;而如果分隔符是破折号( - )或点(。),则假定为欧洲d-m-y格式。
如果您允许您的客户以他们选择的任何格式发送日期,则上述内容可能会引起混淆。我刚刚在date.js中测试了日期5/1/12
和5-1-12
,并且两者都被解析为2012年5月1日.PHP将这两个分别解释为2012年5月1日和2005年1月12日(!!)。
echo date("Y-M-n", strtotime("5/1/12"));
// 2012-May-5
echo date("Y-M-n", strtotime("5-1-12"));
// 2005-Jan-1 (whoops!)
但是,预先格式化日期具有输入日期有效的一些保险的明显好处。在后端保留strtotime()
还可确保您不需要启用JavaScript的客户端来发送请求。您的PHP仍然可以作为Web服务等进行调用,而无需客户端成为Web浏览器。
答案 1 :(得分:0)
两个
您绝对需要在PHP中验证日期,因为您的一个或多个用户可能已禁用Javascript。
Javascript验证很好,因为您可以在输入控件中输入日期,在onblur
处理程序中验证它,并将验证日期写回控件。因此,在用户键入出生日期2/5/01并离开控件后,日期将更改为2001年5月2日,并且用户不仅知道日期被正确解释,而且strtotime()
也明确无误值。
从UX的角度来看,您还可以使用更好的验证反馈。 Javascript可以做到以下(这可能是众所周知的,但它需要一些搜索我找到它)。在页面中放置一个元素,例如
<div id="DobReply"></div>;
然后验证出生日期的功能可以
document.getElementById("DobReply").innerHTML = "Current age is "+age;
其中年龄是根据输入的出生日期和今天的日期计算的变量。一旦用户离开控件,计算出的年龄就会弹出,如果用户输入了当前年份(它发生了),那么她可能会立即发现错误。
所以我也不会摆脱datejs验证。但是,如果禁用Javascript,您可以获得无效日期,奇怪格式的日期或任何内容,所有这些都将丢失。因此,如果您只能拥有一个,请保留strtotime()
。