2013-02-22 127 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並執行檢查。