2008-12-08 77 views
8

如何将Grails中的日期时间字段转换为日期,无需捕获时间?我需要做这个与系统日期比较。转换datetime到日期

class Trip 
{ 
    String name 
    String city 
    Date startDate 
    Date endDate 
    String purpose 
    String notes 

    static constraints = { 
     name(maxLength: 50, blank: false) 
     startDate(validator: {return (it >= new Date())}) // This won't work as it compares the time as well 
     city(maxLength: 30, blank: false) 
    } 
} 

回答

7

有遗憾的是,在Grails|Groovy|Java中执行此操作时不是“开箱即用”的方法。

有人总是Joda-Time抛出一个java.util.Datejava.util.Calendar有人提出疑问的任何时间,但包括又一库并不总是一个选项。

最近,对于类似的问题,我们创建了一个DateTimeUtilstatic方法和像下面得到Date只有一句:

class DateTimeUtil { 

    // ... 

    public static Date getToday() { 
     return setMidnight(new Date()) 
    } 

    public static Date getTomorrow() { 
     return (getToday() + 1) as Date 
    } 

    public static Date setMidnight(Date theDate) { 
     Calendar cal = Calendar.getInstance() 
     cal.setTime(theDate) 
     cal.set(Calendar.HOUR_OF_DAY, 0) 
     cal.set(Calendar.MINUTE, 0) 
     cal.set(Calendar.SECOND, 0) 
     cal.set(Calendar.MILLISECOND, 0) 
     cal.getTime() 
    } 

    //... 

} 

然后,在验证时,可以使用

startDate(validator: {return (it.after(DateTimeUtil.today))}) //Groovy-ism - today implicitly invokes `getToday()` 
+0

似乎是我正在寻找的解决方案,但是由于一些奇怪的原因,它不起作用。即使在添加新类后,验证仍不起作用。有什么我失踪?谢谢 – Omnipotent 2008-12-09 05:32:27

+0

嗯......它怎么“不工作?”我的意思是,控制台上是否有错误,警告或消息?它只是没有调用验证?验证是否返回“误报?” – 2008-12-09 17:39:21

1

尝试使用 'java.sql.Date' 而不是 'java.util.Date' 作为一种类型的日期属性与

formatDate

目的

沿

允许使用由SimpleDateFormat类定义的相同模式来格式化java.util.Date实例。

实例

说明

属性

* format (required) - The format to use for the date 
* date (required) - The date object to format 
0

也许

startDate(validator: {d = new Date(); return (it..d) >= 0}) 
0

您是否尝试过使用jodatime?它使得在java中处理日期和时间变得更加容易。

3

我裂化它:

的startDate(验证:{返回(它> =新日期() - 1)})

这是简单;-)

要更改GSP页面视图:

<g:datePicker name="startDate" value="${trip?.startDate}" years="${years}" precision="day" /> 

感谢大家的贡献

+2

只要它的“startDate”的确定时间晚于或等于24小时(即,昨天的某个时间),Cool!我认为,鉴于我对[问题]的理解有限,我会放弃“> =”并使用“>”(或Date.after(Date))去掉 – 2008-12-09 17:42:06

3

更好地利用压延机插件Grails的。

2

你应该重写制定者只需要日期,而不是时间我们的领域类使用startdate.clearTime()

我们做到这一点。这样,我们可以比较两个实例的日期,而不必稍后再做。 :

def setStartDate(Date date) { 
    date.clearTime() 
    startDate = date 
}