2008-12-08 61 views
8

Làm cách nào để chuyển đổi trường ngày giờ trong Grails thành ngày tháng, với việc thu thập thời gian? Tôi cần phải làm điều này để so sánh với ngày hệ thống.Chuyển đổi ngày giờ thành hiện tại

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) 
    } 
} 

Trả lời

7

Có [tiếc] không phải là phương pháp "ngoài hộp" để thực hiện thao tác này trong Grails|Groovy|Java.

Somebody luôn ném trong Joda-Time bất cứ lúc nào một câu hỏi java.util.Date hoặc java.util.Calendar được nâng lên, nhưng trong đó có nêu ra một thư viện không phải lúc nào cũng là một lựa chọn.

Gần đây nhất, đối với một vấn đề tương tự, chúng tôi tạo ra một lớp DateTimeUtil với static phương pháp và giống như sau để có được một Date chỉ:

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() 
    } 

    //... 

} 

Sau đó, trong validator, bạn có thể sử dụng

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

dường như là giải pháp mà tôi đang tìm kiếm, tuy nhiên vì một lý do kỳ lạ nào đó nó không hoạt động. việc xác thực không hoạt động ngay cả sau khi tôi thêm lớp mới. Có cái gì đó mà tôi đang thiếu? Cảm ơn – Omnipotent

+0

Hmm ... thế nào là "không hoạt động?" Ý tôi là, có bất kỳ lỗi, cảnh báo hoặc thông báo nào trên bảng điều khiển không? Liệu nó chỉ không gọi xác nhận? Việc xác thực có trả về "các mặt tích cực sai?" –

1

Hãy thử sử dụng 'java.sql.Date' không 'java.util.Date' như một loại tài sản ngày của bạn cùng với

formatDate

Mục đích

Cho phép định dạng các cá thể java.util.Date sử dụng cùng các mẫu được định nghĩa bởi lớp SimpleDateFormat.

Ví dụ

Mô tả

Thuộc tính

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

lẽ

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

Bạn đã thử sử dụng jodatime? Nó làm việc với ngày tháng và thời gian trong java dễ dàng hơn rất nhiều.

3

tôi nứt nó:

STARTDATE (validator: {return (nó> = new Date() - 1)})

Nó là đơn giản ;-)

Để thay đổi quan điểm trong trang GSP:

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

Cảm ơn tất cả mọi người cho sự đóng góp

+2

Miễn là OK cho "startDate" được xác nhận là muộn hơn hoặc bằng 24 giờ trước (ví dụ, ngày hôm qua một thời gian), Cool! Tôi nghĩ, với sự hiểu biết [hạn chế] của tôi về vấn đề này, tôi sẽ bỏ "> =" và đi với ">" (hoặc Date.after (Date)) –

3

Better Plugin sử dụng lịch trong Grails.

+0

+ 1-> Nó rất đẹp so với tag datepicker . – DonX

2

Bạn nên sử dụng startdate.clearTime()

Chúng tôi làm điều này bằng cách ghi đè setter cho các lớp miền của chúng tôi mà chỉ cần ngày và không thời gian. Bằng cách đó, chúng ta có thể so sánh ngày của hai trường hợp mà không cần phải làm điều này sau. :

def setStartDate(Date date) { 
    date.clearTime() 
    startDate = date 
} 
Các vấn đề liên quan