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 }