001    package railo.commons.date;
002    
003    import java.util.Calendar;
004    import java.util.HashMap;
005    import java.util.Locale;
006    import java.util.Map;
007    import java.util.TimeZone;
008    
009    import railo.runtime.engine.ThreadLocalPageContext;
010    import railo.runtime.op.Caster;
011    import railo.runtime.type.dt.DateTime;
012    
013    public class JREDateTimeUtil extends DateTimeUtil {
014            
015            private static CalendarThreadLocal calendar=new CalendarThreadLocal();
016            
017            private Calendar year;
018            private Calendar month;
019            private Calendar day;
020            private Calendar hour;
021            private Calendar minute;
022            private Calendar second;
023            private Calendar milliSecond;
024            //private Calendar dayOfYear;
025            //private Calendar dayOfWeek;
026            //private Calendar week;
027            //private Calendar time;
028            private Calendar milliSecondsInDay;
029            private Calendar daysInMonth;
030            Calendar string;
031    
032            //private static Map tzCalendars=new HashMap();
033            private static Map<Locale,Calendar> localeCalendars=new HashMap<Locale,Calendar>();
034            
035            
036            
037            JREDateTimeUtil() {
038                    
039            }
040    
041             long _toTime(TimeZone tz, int year, int month, int day, int hour,int minute, int second, int milliSecond) {
042                    tz=ThreadLocalPageContext.getTimeZone(tz);
043                    Calendar time = getCalendar(tz);
044                    synchronized(time){
045                            time.set(year,month-1,day,hour,minute,second);
046                            time.set(Calendar.MILLISECOND,milliSecond);  
047                    return time.getTimeInMillis();
048                    }
049            
050            }
051    
052            private static int get(Calendar calendar,TimeZone tz, DateTime dt, int field) {
053                    //synchronized (calendar) {
054                            calendar.setTimeZone(tz); 
055                    calendar.setTimeInMillis(dt.getTime());         
056                    return calendar.get(field);
057            //}
058            }
059    
060            /**
061             * @see railo.commons.date.DateTimeUtil#getYear(java.util.TimeZone, railo.runtime.type.dt.DateTime)
062             */
063            public synchronized int getYear(TimeZone tz, DateTime dt) {
064                    if(year==null)year=newInstance();
065                    return get(year,tz,dt,Calendar.YEAR);
066            }
067    
068            /**
069             * @see railo.commons.date.DateTimeUtil#getMonth(java.util.TimeZone, railo.runtime.type.dt.DateTime)
070             */
071            public synchronized int getMonth(TimeZone tz, DateTime dt) {
072                    if(month==null)month=newInstance();
073                    return get(month,tz,dt,Calendar.MONTH)+1;
074            }
075    
076            /**
077             * @see railo.commons.date.DateTimeUtil#getDay(java.util.TimeZone, railo.runtime.type.dt.DateTime)
078             */
079            public synchronized int getDay(TimeZone tz, DateTime dt) {
080                    if(day==null)day=newInstance();
081                    return get(day,tz,dt,Calendar.DAY_OF_MONTH);
082            }
083    
084            /**
085             * @see railo.commons.date.DateTimeUtil#getHour(java.util.TimeZone, railo.runtime.type.dt.DateTime)
086             */
087            public synchronized int getHour(TimeZone tz, DateTime dt) {
088                    if(hour==null)hour=newInstance();
089                    return get(hour,tz,dt,Calendar.HOUR_OF_DAY);
090            }
091    
092            /**
093             * @see railo.commons.date.DateTimeUtil#getMinute(java.util.TimeZone, railo.runtime.type.dt.DateTime)
094             */
095            public synchronized int getMinute(TimeZone tz, DateTime dt) {
096                    if(minute==null)minute=newInstance();
097                    return get(minute,tz,dt,Calendar.MINUTE);
098            }
099    
100            /**
101             * @see railo.commons.date.DateTimeUtil#getSecond(java.util.TimeZone, railo.runtime.type.dt.DateTime)
102             */
103            public synchronized int getSecond(TimeZone tz, DateTime dt) {
104                    if(second==null)second=newInstance();
105                    return get(second,tz,dt,Calendar.SECOND);
106            }
107    
108            /**
109             * @see railo.commons.date.DateTimeUtil#getMilliSecond(java.util.TimeZone, railo.runtime.type.dt.DateTime)
110             */
111            public synchronized int getMilliSecond(TimeZone tz, DateTime dt) {
112                    if(milliSecond==null)milliSecond=newInstance();
113                    return get(milliSecond,tz,dt,Calendar.MILLISECOND);
114            }
115    
116            /**
117             * @see railo.commons.date.DateTimeUtil#getWeek(java.util.TimeZone, railo.runtime.type.dt.DateTime)
118             */
119            public synchronized int getWeekOfYear(Locale locale,TimeZone tz, DateTime dt) {
120                    Calendar c=getCalendar(locale);
121                    synchronized (c) {
122                            c.setTimeZone(tz); 
123                    c.setTimeInMillis(dt.getTime());         
124                    int week=c.get(Calendar.WEEK_OF_YEAR);
125                            
126                            if(week==1 && c.get(Calendar.MONTH)==Calendar.DECEMBER) {
127                                    if(isLeapYear(c.get(Calendar.YEAR)) && c.get(Calendar.DAY_OF_WEEK)==1){
128                                            return 54;
129                                    }
130                                    return 53;
131                            }
132                            return week;
133                    }
134            }
135    
136            /**
137             * @see railo.commons.date.DateTimeUtil#getDayOfYear(java.util.TimeZone, railo.runtime.type.dt.DateTime)
138             */
139            public synchronized int getDayOfYear(Locale locale,TimeZone tz, DateTime dt) {
140                    Calendar c=getCalendar(locale);
141                    synchronized (c) {
142                            return get(c,tz,dt,Calendar.DAY_OF_YEAR);
143                    }
144            }
145    
146            /**
147             * @see railo.commons.date.DateTimeUtil#getDayOfYear(java.util.TimeZone, railo.runtime.type.dt.DateTime)
148             */
149            public synchronized int getDayOfWeek(Locale locale,TimeZone tz, DateTime dt) {
150                    Calendar c=getCalendar(locale);
151                    synchronized (c) {
152                            return get(c,tz,dt,Calendar.DAY_OF_WEEK);
153                    }
154            }
155    
156            public synchronized long getMilliSecondsInDay(TimeZone tz,long time) {
157                    if(milliSecondsInDay==null)milliSecondsInDay=newInstance();
158                    milliSecondsInDay.clear();
159                    milliSecondsInDay.setTimeZone(ThreadLocalPageContext.getTimeZone(tz));
160                    milliSecondsInDay.setTimeInMillis(time);         
161            return  (milliSecondsInDay.get(Calendar.HOUR_OF_DAY)*3600000)+
162                    (milliSecondsInDay.get(Calendar.MINUTE)*60000)+
163                    (milliSecondsInDay.get(Calendar.SECOND)*1000)+
164                    (milliSecondsInDay.get(Calendar.MILLISECOND));
165        }
166    
167            public synchronized int getDaysInMonth(TimeZone tz, DateTime dt) {
168                    if(daysInMonth==null)daysInMonth=newInstance();
169                    daysInMonth.clear();
170                    daysInMonth.setTimeZone(tz); 
171                    daysInMonth.setTime(dt);         
172                    return daysInMonth(daysInMonth.get(Calendar.YEAR), daysInMonth.get(Calendar.MONTH)+1);
173            }
174    
175            public long getDiff(TimeZone tz, int datePart, DateTime left, DateTime right) {
176                    
177                    return 0;
178            }
179    
180            public synchronized String toString(DateTime dt, TimeZone tz) {
181                    if(string==null)string=newInstance();
182                    //synchronized (string) {
183                            tz=ThreadLocalPageContext.getTimeZone(tz);
184                            string.setTimeZone(tz);
185                            string.setTimeInMillis(dt.getTime());
186                            //"HH:mm:ss"
187                            StringBuilder sb=new StringBuilder();
188                    
189                    sb.append("{ts '");
190                    toString(sb,string.get(Calendar.YEAR),4);
191                    sb.append("-");
192                    toString(sb,string.get(Calendar.MONTH)+1,2);
193                    sb.append("-");
194                    toString(sb,string.get(Calendar.DATE),2);
195                    sb.append(" ");
196                    toString(sb,string.get(Calendar.HOUR_OF_DAY),2);
197                    sb.append(":");
198                    toString(sb,string.get(Calendar.MINUTE),2);
199                    sb.append(":");
200                    toString(sb,string.get(Calendar.SECOND),2);
201                    sb.append("'}");
202                     
203                    return sb.toString();
204            //}
205            }
206    
207    
208            public static Calendar newInstance() {
209                    return Calendar.getInstance(Locale.US);
210            }
211            
212            public static Calendar newInstance(Locale l) {
213                    return Calendar.getInstance(l);
214            }
215    
216            public static Calendar newInstance(TimeZone tz) {
217                    return Calendar.getInstance(tz,Locale.US);
218            }
219    
220            public static Calendar getCalendar(Locale l) {
221                    Calendar c=localeCalendars.get(l);
222                    if(c==null){
223                            c=Calendar.getInstance(l);
224                            localeCalendars.put(l, c);
225                    }
226                    return c;
227            }
228            
229            public static Calendar getCalendar(){
230                    return calendar.get();
231            }
232            
233            public static Calendar getCalendar(TimeZone tz){
234                    Calendar c=getCalendar();
235                    c.setTimeZone(tz);
236                    return c;
237            }
238            
239            
240            /*public  static Calendar newInstance(Locale l) {
241                    Calendar c=Calendar.getInstance(l);
242                    return c;
243            }*/
244    
245            void toString(StringBuilder sb,int i, int amount) {
246                    String str = Caster.toString(i);
247                    while(str.length()<(amount--)){
248                            sb.append( '0');
249                    }
250                    sb.append(str);
251            }
252    }
253    
254    
255    class CalendarThreadLocal extends ThreadLocal<Calendar> {
256            protected synchronized Calendar initialValue() {
257            return Calendar.getInstance();
258        }
259    }