2008-12-08 2 views
8

Как конвертировать поле datetime в Grails только на дату, не задерживая время? Мне нужно сделать это для сравнения с системной датой.Преобразование даты и времени на сегодняшний день

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.Date или java.util.Calendar вопрос, но в том числе и еще одна библиотека не всегда вариант.

Совсем недавно для подобной проблемы, мы создали DateTimeUtil класс с static методами и что-то вроде следующего, чтобы получить 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

Цель

Позволяет форматировать экземпляры java.util.Date с использованием тех же шаблонов, которые определены классом SimpleDateFormat.

Примеры

Описание

Атрибуты

* 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 
} 
Смежные вопросы