2012-01-28 121 views
0

我正在开发一个系统,要求您至少应年满18岁才能注册。Javascript日期差异

为了做到这一点验证我已经在以下方式在JavaScript中实现日期差异,但它不是准确的,有没有任何JavaScript函数或其他方式来做到这一点?

var d1=new Date(1985,1,28); 
var d2=new Date(); 
var milli=d2-d1; 
var milliPerYear=1000*60*60*24*365.26; 
var years_old=milli/milliPerYear; 
+2

任何客户端验证可以很容易地规避。始终在服务器端进行验证。虽然在这种情况下,你甚至不能确保一个人提供他真正的生日。 – 2012-01-28 11:03:03

+0

是的 - 这是更多的用户意见的责任问题,而不是一个完整的信用检查或任何东西。客户端验证没问题。 – cloudfeet 2014-11-28 14:24:05

回答

8

法律上是至少18岁的不是关于时间对应于18岁的平均持续时间的量(年并不总是具有相同的长度)。这是关于当前日期是在您的第18次出生日期之后。因此,您应该在出生日期的年份数中加上18,看看是在现在的日期之前还是之后,例如,

var birthDate = new Date(1985,1,28); 
var today = new Date(); 
if (today >= new Date(birthDate.getFullYear() + 18, birthDate.getMonth(), birthDate.getDate())) { 
    // Allow access 
} else { 
    // Deny access 
} 

你应该在服务器端也做同样的验证。

请注意,这也处理2月29日出生的人正确的方式:在这种情况下,JavaScript将创建一个日期对象来表示18年后的3月1日。

+2

重要的一点。我们不会计算我们出生以来的毫秒数来庆祝我们的生日。 – 2012-01-28 11:15:12

+0

@mack是的,为什么你会期待其他? – 2012-01-28 11:23:02

+0

对不起,'var birthDate = new Date(1994,1,27); var today = new Date();如果(today> = new Date(birthDate.getFullYear()+ 18,birthDate.getMonth(),birthDate.getDay())){ alert(“Allow”); } else { alert(“Deny”); } '试试这个,它会提示拒绝 – mack 2012-01-28 11:29:49

1

我喜欢http://momentjs.com/

<script src="moment.min.js"></script> 
<script> 
    var dob = new moment([1985,1,28]); 
    var age = new.moment().diff(dob, 'years') 

    if (age >= 18) { 
    ... 
    } 
</script> 
+0

'var dob = new moment([1985,1,30]); var age = new moment()。diff(dob,'years') alert(age);'it alerts 27 – mack 2012-01-28 11:38:37

+0

在我的机器上,有3个测试失败:http://momentjs.com/test/ – user123444555621 2012-01-28 12:21:50

+0

人们出生于1985年,今年年龄27岁,更多的数学研究...... – Teemu 2012-01-28 13:43:34