source: trunk/grails-app/services/DateUtilService.groovy @ 553

Last change on this file since 553 was 553, checked in by gav, 10 years ago

Small refator of DateUtilService.
New plusMonth() replaces getNextMonth and getPreviousMonth().
Clarify getDayFromDate() to getDayOfMonthFromDate().

File size: 5.9 KB
Line 
1import org.codehaus.groovy.runtime.TimeCategory
2// the above will be deprecated and replaced by: groovy.time.TimeCategory
3/// @todo: consider moving this to org.gnumims.DateUtil
4/// pros: easy to use in domain classes.
5/// cons: have to import so pulls in all referenced imports? Injection probably does that anyway.
6
7/**
8* Provides some convenience methods for working with dates.
9*/
10class DateUtilService {
11
12    boolean transactional = false
13    //static scope = "request"
14
15    /**
16    * Get the start of today.
17     * Can be call as dateUtilService.today or dateUtilService.getToday().
18     * @returns A Date object with today's date and all time fields set to 0.
19    */
20    public static Date getToday() {
21        return getMidnight(new Date())
22    }
23
24    /**
25    * Get the start of tomorrow.
26     * Can be call as dateUtilService.tomorrow or dateUtilService.getTomorrow().
27     * @returns A Date object with tomorrow's date and all time fields set to 0.
28    */
29    public static Date getTomorrow() {
30        return (getToday() + 1) as Date
31    }
32
33    /**
34    * Get the start of yesterday.
35     * Can be call as dateUtilService.yesterday or dateUtilService.getYesterday().
36     * @returns A Date object with yesterday's date and all time fields set to 0.
37    */
38    public static Date getYesterday() {
39        return (getToday() - 1) as Date
40    }
41
42    /**
43    * Get the start of the day one week ago.
44     * Can be call as dateUtilService.oneWeekAgo or dateUtilService.getOneWeekAgo().
45     * @returns A Date object with the date one week ago and all time fields set to 0.
46    */
47    public static Date getOneWeekAgo() {
48        return (getToday() - 7) as Date
49    }
50
51    /**
52    * Get the start of the day one week ago.
53     * Can be call as dateUtilService.oneWeekAgo or dateUtilService.getOneWeekAgo().
54     * @returns A Date object with the date one week ago and all time fields set to 0.
55    */
56    public static Date getOneWeekFromNow() {
57        return (getToday() + 7) as Date
58    }
59
60    /**
61    * Get the start of a given date by setting all time fields to 0.
62    * The Calendar.getInstance() or Calendar.instance factory returns a new calendar instance, usually
63    * a Gregorian calendar but using Calendar we don't have to worry about those details.
64    * The time fields are then set to zero and cal.getTime() or cal.time returns a java.util.Date object.
65    * @param date The Date object to start with.
66    * @returns A Date object having the given date and all time fields set to 0, so the very start of the given day.
67    */
68    public static Date getMidnight(Date date) {
69        Calendar cal = Calendar.instance
70        cal.setTime(date)
71        cal.set(Calendar.HOUR_OF_DAY, 0)
72        cal.set(Calendar.MINUTE, 0)
73        cal.set(Calendar.SECOND, 0)
74        cal.set(Calendar.MILLISECOND, 0)
75        cal.time
76    }
77
78    /**
79    * Get the date plus x weeks.
80    * @param date The Date object to start with, defaults to today.
81    * @param plusYears The number of weeks to add, defaults to 1.
82    * @returns A Date object adjusted by x weeks.
83    */
84    public static Date plusWeek(Date date = new Date(), Integer plusWeeks = 1) {
85        use(TimeCategory) {
86            date + plusWeeks.weeks
87        }
88    }
89
90    /**
91    * Get the date plus x months.
92    * @param date The Date object to start with, defaults to today.
93    * @param plusYears The number of months to add, defaults to 1.
94    * @returns A Date object adjusted by x months.
95    */
96    public static Date plusMonth(Date date = new Date(), Integer plusMonths = 1) {
97        use(TimeCategory) {
98            date + plusMonths.months
99        }
100    }
101
102    /**
103    * Get the date plus x years.
104    * @param date The Date object to start with, defaults to today.
105    * @param plusYears The number of years to add, defaults to 1.
106    * @returns A Date object adjusted by x years.
107    */
108    public static Date plusYear(Date date = new Date(), Integer plusYears = 1) {
109        use(TimeCategory) {
110            date + plusYears.years
111        }
112    }
113
114    /**
115    * Make a date object from supplied year, month, day values.
116    * The Calendar.getInstance() or Calendar.instance factory returns a new calendar instance, usually
117    * a Gregorian calendar but using Calendar we don't have to worry about those details.
118    * The time fields are set to zero and cal.getTime() or cal.time returns a java.util.Date object.
119    * @param year The year as a string or integer.
120    * @param month The month as a string or integer, defaults to 1 (i.e. January).
121    * @param day The day as a string or integer, defaults to 1.
122    * @returns A Date object having the given date and all time fields set to 0, so the very start of the given day.
123    */
124    public static Date makeDate(year, month=1, day=1) {
125        Calendar cal = Calendar.instance
126        cal.clear()
127        // Stupid month is 0-based, grumble.
128        cal.set(year.toInteger(), month.toInteger()-1, day.toInteger())
129        cal.time
130    }
131
132    /**
133    * Get the day of month from supplied date.
134    * @param date The date to extract the day of month from.
135    * @returns An integer representing the day of the month.
136    */
137    public static Integer getDayOfMonthFromDate(Date date) {
138        Calendar cal = Calendar.instance
139        cal.setTime(date)
140        cal.get(Calendar.DAY_OF_MONTH)
141    }
142
143    /**
144    * Get the month from supplied date.
145    * @param date The date to extract the month from.
146    * @returns An integer representing the month.
147    */
148    public static Integer getMonthFromDate(Date date) {
149        Calendar cal = Calendar.instance
150        cal.setTime(date)
151        cal.get(Calendar.MONTH) + 1 // Stupid month is 0-based, grumble.
152    }
153
154    /**
155    * Get the year from supplied date.
156    * @param date The date to extract the year from.
157    * @returns An integer representing the year.
158    */
159    public static Integer getYearFromDate(Date date) {
160        Calendar cal = Calendar.instance
161        cal.setTime(date)
162        cal.get(Calendar.YEAR)
163    }
164
165}
Note: See TracBrowser for help on using the repository browser.