2013-02-22 78 views
0

我试图添加约束到用户提交的文本字段,这是有出生日期。我需要用户至少18岁,但不能超过113岁。Grails日期约束

final static Date MIN_DATE = new Date(Calendar.YEAR-18) 
final static Date MAX_DATE = new Date(Calendar.YEAR-100) 

static constraints = { 
    dob(nullabe: false, min: MIN_DATE, max: MAX_DATE 
} 

我,

System.out.println('Year Max Date: ' + person.MAX_DATE) 

它给了我,

Year Max Date: Wed Dec 31 17:59:59 CST 1969 

也是如此最小日期。

我试着做

final static Date MIN_DATE = new Date().getAt(Calendar.YEAR)-18 

,但没有在所有的工作。我也尝试过不用-18,并得到了正确的答案,但它是7个小时了。当我试图从本地重新启动应用程序时,它将其崩溃。从那以后,我无法重现它。

我已经了解到,它给出的日期是“Epoch”日期或Unix启动之前的日期。我只是不知道如何解决它。

对这个问题有任何想法/建议/疑虑/经验? 任何帮助将不胜感激。

回答

1

我没有这些限制达成一致,首先因为他们似乎武断(为什么有人不超过100旧的?为什么我不能只是躺在如果我16?)

其次,如果Web服务器则弥补了几年,这些静态日期将慢慢漂

但无论如何,(这些问题除外),我相信你想要的是:

final static Date MIN_DATE = Calendar.instance.with { add(YEAR, -18) ; it }.time 
final static Date MAX_DATE = Calendar.instance.with { add(YEAR, -100) ; it }.time 
+0

其员工使用的应用程序。它只是在那里捕捉和避免错别字。但是,这工作得很好。非常感谢。实际上,逻辑上,最小和最大需要切换。我非常感谢帮助! – CoffeePeddlerIntern 2013-02-22 16:36:43

0

问题是Date构造函数需要一个参数,表示自1970年1月1日00:00:00 GMT以来的毫秒数。由于Calendar.YEAR是一个常数,用于表示Calendar结构中的年份字段,等于1,因此您将获得上述值。

0

您需要使用SimpleDateFormat将用户提交的文本字段(字符串)转换为Date对象。然后用Date对象创建一个Calendar并检查Year字段。

或者,您可以自己解析文本字段(String)并选择年份,转换为int并执行检查。