Package railo.runtime.functions.dateTime

Source Code of railo.runtime.functions.dateTime.DateAdd

/**
* Implements the CFML Function dateadd
*/
package railo.runtime.functions.dateTime;

import java.util.Calendar;
import java.util.TimeZone;

import railo.commons.date.JREDateTimeUtil;
import railo.runtime.PageContext;
import railo.runtime.exp.ExpressionException;
import railo.runtime.ext.function.Function;
import railo.runtime.type.dt.DateTime;
import railo.runtime.type.dt.DateTimeImpl;

public final class DateAdd implements Function {

  private static final long serialVersionUID = -5827644560609841341L;

  public static DateTime call(PageContext pc , String datepart, double number, DateTime date) throws ExpressionException {
    return _call(pc,pc.getTimeZone(), datepart, number, date);
  }
 
  public synchronized static DateTime _call(PageContext pc ,TimeZone tz, String datepart, double number, DateTime date) throws ExpressionException {
    datepart=datepart.toLowerCase();
    long l=(long)number;
    int n=(int) l;
    char first=datepart.length()==1?datepart.charAt(0):(char)0;

    if(first=='l')       return new DateTimeImpl(pc,date.getTime()+l,false);
    else if(first=='s')   return new DateTimeImpl(pc,date.getTime()+(l*1000),false);
    else if(first=='n')    return new DateTimeImpl(pc,date.getTime()+(l*60000),false);
    else if(first=='h')    return new DateTimeImpl(pc,date.getTime()+(l*3600000),false);
   
   
    Calendar c=JREDateTimeUtil.getThreadCalendar();
    //if (c == null)c=JREDateTimeUtil.newInstance();
        //synchronized (c) {
          //c.clear();
          c.setTimeZone(tz);
          c.setTimeInMillis(date.getTime());
     
      if(datepart.equals("yyyy")) {
        c.set(Calendar.YEAR,c.get(Calendar.YEAR)+n);
      }
      else if(datepart.equals("ww")) c.add(Calendar.WEEK_OF_YEAR,n);
      else if(first=='q') c.add(Calendar.MONTH,(n*3));
      else if(first=='m') c.add(Calendar.MONTH,n);
      else if(first=='y') c.add(Calendar.DAY_OF_YEAR,n);
      else if(first=='d') c.add(Calendar.DATE,n);
      else if(first=='w') {
        int dow = c.get(Calendar.DAY_OF_WEEK);
              int offset;
              // -
              if(n < 0) {
                  if(Calendar.SUNDAY==dow) offset=2;
                  else offset=-(6-dow);
              }
              // +
              else {
                  if(Calendar.SATURDAY==dow) offset=-2;
                  else offset=dow-2;
              }
              c.add(Calendar.DAY_OF_WEEK, -offset);
             
              if(dow==Calendar.SATURDAY || dow==Calendar.SUNDAY) {
                  if(n>0) n--;
                  else if(n<0) n++;
              }
              else n+=offset;
              c.add(Calendar.DAY_OF_WEEK, (n / 5) * 7 + n % 5);
             
      }
     
      else {
        throw new ExpressionException("invalid datepart identifier ["+datepart+"] for function dateAdd");
      }
      return new DateTimeImpl(pc,c.getTimeInMillis(),false);
        //}
  }
}
TOP

Related Classes of railo.runtime.functions.dateTime.DateAdd

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.