hpdatetime.java

来自「一个简单的visio程序。」· Java 代码 · 共 2,210 行 · 第 1/5 页

JAVA
2,210
字号
        double dbl = getdt_db( new VString(exp.getfixedString() ) );
        if(dbl < -657435 || dbl > 2958465)
           throw new HpException(5,"Invalid procedure call");

        dbl -= Math.floor( dbl);
        return new HDate(dbl);
    }
    public static HDate TIMEVALUE(String  exp) throws HpException
    {
        double dbl = getdt_db( new VString(exp) );
        if(dbl < -657435 || dbl > 2958465)
           throw new HpException(5,"Invalid procedure call");

        dbl -= Math.floor( dbl);
        return new HDate(dbl);
    }


    /**
	 *DateAdd(interval,number,date)
	 *Returns a Variant containing a date to which a specified time interval has
	 *been added.
	 */
    public static Variant DATEADD(Variant varstr,Variant varnum,Variant exp)
        throws HpException
    {
    HCDateTimeStruct    tm = new HCDateTimeStruct();
    int                 i=0, strint=0 ,num=0;
    double              yd=0, num_dbl;

    num_dbl = hpstring.get_db( varnum);

	double  dbl = getdt_db( exp );
    tm.DT_DblToStruc(dbl);

    int    y = tm.dt_year;
    int    m = tm.dt_month;
    int    d = tm.dt_mday;
    int    h = tm.dt_hour;
    int    n = tm.dt_minute;
    int    s = tm.dt_second;
    int    q = tm.dt_season;
    int    w = tm.dt_week;
    String   str = hpstring.get_str( varstr );
    if( str==null )
        throw new HpException(94, "Invalid use of null");

    str = str.toLowerCase();
    if ( str.compareTo("yyyy") == 0 )    //year
    	strint = 1;
    else  if ( str.compareTo("q") == 0 )  //Quarter
    	strint = 2;
    else  if ( str.compareTo("m") == 0 )    //Month
    	strint = 3;
    else  if ( str.compareTo("y") == 0 )    //Day of Year
    	strint = 4;
    else  if ( str.compareTo("d") == 0 )    //Day of month
    	strint = 5;
    else  if ( str.compareTo("w") == 0 )    //Weekday
    	strint = 6;
    else  if ( str.compareTo("ww") == 0 )   //Week
    	strint = 7;
    else  if ( str.compareTo("h") == 0 )    //Hour
    	strint = 8;
    else  if ( str.compareTo("n") == 0 )    //minute
    	strint = 9;
    else  if ( str.compareTo("s") == 0 )    //second
    	strint = 10;
    else
    	throw new HpException(95,"Invalid procedure call") ;


    int    da[] = new int[3], ti[] = new int[3];
    UdtDatetime   ud = new UdtDatetime();
    double  dat, t, tmpd=0;

    switch (strint)
	{
        case 1 :			  /* yyyy */
        num =  (int)(num_dbl);
		y += num;
		if (y < 100 || y > 9999)
	        throw new HpException(95,"Invalid procedure call");

		if ( (y%4 == 0 && y%100 != 0) || (y%400 == 0) ){
		    if  ( (m == 2) && (d >29) )
			d = 29;
			}
		  else
			 {
			 if  ( (m == 2) && (d > 28) )
			 d = 28;
			 }


        	if (y < 100 || y > 9999)
        	    throw new HpException(95,"Invalid procedure call");

            da[0] = m;      da[1] = d;       da[2] = y;
            ti[0] = h;      ti[1] = n;       ti[2] = s;

            dat = ud.isda(da);
            t = ud.isti(ti);
            if ( dat<0 )
                tmpd = dat - t;
            else
                tmpd = dat + t;

            tmpd = tmpd + yd;


		break;

	  case 2 :					/*  q */
          num =  (int)(num_dbl);

		  if ( y < 100 )
			  y += 1900;
		  y += (int)(num/4);
		  if (num >= 0)
			  {
			  m += (int)( num%4 )*3;
			  if ( m > 12 )
				  {
				  m -= 12;
				  y += 1;
				  }
			  }
		  else
			  {
			  if ( -(num%4)*3 > m )
				  {
				  y -= 1;
				  m = 12+m + ( num%4 )*3 ;
				  }
			  else
				  m = m + ( num%4 ) * 3 ;
			  }

		  int   daa=0;
		  for( daa=0, i=1; i < m; i++ )
			  daa += tm.Month_Day( (int)y,i );
		  daa += d+1;
		  if ( (y<1 && daa<1) || ( y>9999 && daa>365) )
		  throw new HpException(95,"Invalid procedure call");

		  if ( (y%4 == 0 && y%100 != 0) || (y%400 ==0) )
			  {
			  if ( (m == 2) && (d > 29) )
			  d = 29;
			  }
		  else if ( (m == 2) && (d > 28) )
			  d = 28;
		  if ( ( (m == 4) || (m == 6) || (m == 9) || (m == 11) ) && (d == 31) )
			  d = 30;


    	if (y < 100 || y > 9999)
    	    throw new HpException(95,"Invalid procedure call");
        da[0] = m;      da[1] = d;       da[2] = y;
        ti[0] = h;      ti[1] = n;       ti[2] = s;

        dat = ud.isda(da);
        t = ud.isti(ti);
        if ( dat<0 )
            tmpd = dat - t;
        else
            tmpd = dat + t;

        tmpd = tmpd + yd;


		  break;

	  case 3 :			   /*  m  */
          num =  (int)(num_dbl);
		  y += (int)(num/12);
		  if (num >= 0)
			  {
			  m += (int)num%12;
			  if ( m>12 )
				  {
				  y += 1;
				  m -= 12;
				  }
			  }
		  else if ( -(num%12) < m )
			  m += (int)num%12;
		  else
			  {
			  y -= 1;
			  m = 12 + m + (int)num%12 ;
			  }
		  int  yda;
		  for (yda=0, i=1; i < m; i++ )
			  yda += tm.Month_Day( (int)y,i );
		  yda += d+1;
		  if ( (y < 1 && yda < 1) || (y > 9999 && yda > 365) )
          throw new HpException(95,"Invalid procedure call");

		  if ( (y%4 == 0 && y%100 != 0) || (y%400 == 0) )
			  {
			  if ( (m == 2) && (d > 29) )
				  d = 29;
			  }
		  else if ((m == 2) && (d > 28) )
			  d=28;
		  if  ( ( (m == 4) || (m == 6) || (m == 9) || (m == 11) ) && (d == 31) )
			  d = 30;


    	if (y < 100 || y > 9999)
    	    throw new HpException(95,"Invalid procedure call");

        da[0] = m;      da[1] = d;       da[2] = y;
        ti[0] = h;      ti[1] = n;       ti[2] = s;

        dat = ud.isda(da);
        t = ud.isti(ti);
        if ( dat<0 )
            tmpd = dat - t;
        else
            tmpd = dat + t;

        tmpd = tmpd + yd;


		  break;

    case 4:		  /*  y  */
    case 5:		  /*  d  */
    case 6:		  /*  w  */
        num = (int)num_dbl;
        yd = (double)num;

    	if (y < 100 || y > 9999)
    	    throw new HpException(95,"Invalid procedure call");

        da[0] = m;      da[1] = d;       da[2] = y;
        ti[0] = h;      ti[1] = n;       ti[2] = s;

        dat = ud.isda(da);
        t = ud.isti(ti);

        if ( dat<0 )
            tmpd = dat - t;
        else
            tmpd = dat + t;

        tmpd = tmpd + yd;

        break;

    case 7:		  /*  ww */
        num =  (int)(num_dbl);
	    yd = (double)num*7;

    	if (y < 100 || y > 9999)
    	    throw new HpException(95,"Invalid procedure call");
        da[0] = m;      da[1] = d;       da[2] = y;
        ti[0] = h;      ti[1] = n;       ti[2] = s;

        dat = ud.isda(da);
        t = ud.isti(ti);
        if ( dat<0 )
            tmpd = dat - t;
        else
            tmpd = dat + t;

        tmpd = tmpd + yd;
	    break;

	case 8:		  /*  h  */
        num = (int)( num_dbl) ;

    	if (y < 100 || y > 9999)
    	    throw new HpException(95,"Invalid procedure call");
        da[0] = m;      da[1] = d;       da[2] = y;
        ti[0] = h;      ti[1] = n;       ti[2] = s;
        dat = ud.isda(da);
        t = ud.isti(ti);

        if( dat>0 )
        {
            if( (double)num==num_dbl )
                yd = num_dbl/24 ;
            else
                yd = num/24;

            tmpd = dat + t + yd  ;
        }
        else
        {
            num = (int)(num_dbl);
            if( (double)num==num_dbl && (dbl>=0 || (dbl-(int)dbl)==0 )  )
            {
                yd = num/24;
                tmpd = dat - t + 2 * yd - num_dbl/24;
            }
            else
            {
                yd = num/24;
                tmpd = dat + t + yd  + ( (dbl-num)/24-  (int)((dbl-num)/24));// + 0.6345045552;
            }
        }
        break;

    case 9:       /*  n  */
        num =  hpstring.dbl2int(num_dbl);
        yd = (double)num/(24*60);

    	if (y < 100 || y > 9999)
    	    throw new HpException(95,"Invalid procedure call");
        da[0] = m;      da[1] = d;       da[2] = y;
        ti[0] = h;      ti[1] = n;       ti[2] = s;

        dat = ud.isda(da);
        t = ud.isti(ti);

        if ( dat<0 || dat==t )
            tmpd = dat -t - yd + 2*(int)yd;
        else
            tmpd = dat + t + yd;
        break;

    case 10:      /*  s  */
        num =  hpstring.dbl2int(num_dbl);
    	yd = (double)num/(24*3600);

    	if (y < 100 || y > 9999)
    	    throw new HpException(95,"Invalid procedure call");
        da[0] = m;      da[1] = d;       da[2] = y;
        ti[0] = h;      ti[1] = n;       ti[2] = s;

        dat = ud.isda(da);
        t = ud.isti(ti);
        if ( dat<0 )
            tmpd = dat - t;
        else
            tmpd = dat + t;

        tmpd = tmpd + yd;
        break;
    }

    return new VDate(tmpd);
    }


    /**
	 *DatePart(interval, date[, firstdayofweek[, firstweekofyear]])
	 *Returns a specified part of a given date.
	 */
    public static short DATEPART(Variant varstr,Variant exp) throws HpException
    {
	HCDateTimeStruct	    tm = new HCDateTimeStruct();
	double                  dbl=0;
    short                   strint=0;

    String   str = hpstring.get_str( varstr );
    str = str.toLowerCase();
    if( str.compareTo("yyyy")==0    )
        strint = 1;
    else if( str.compareTo("q")==0  )
        strint = 2;
    else if( str.compareTo("m")==0  )
        strint = 3;
    else if( str.compareTo("y")==0  )
        strint = 4;
    else if( str.compareTo("d")==0  )
        strint = 5;
    else if( str.compareTo("w")==0  )
        strint = 6;
    else if( str.compareTo("ww")==0 )
        strint = 7;
    else if( str.compareTo("h")==0  )
        strint = 8;
    else if( str.compareTo("n")==0  )
        strint = 9;
    else if( str.compareTo("s")==0  )
        strint = 10;
    else
        throw new HpException(8,"Illegal function call");

    dbl = getdt_db( exp );
    tm.DT_DblToStruc(dbl);

    int  partint=0;
    switch( strint )
    {
        case 1:    //yyyy
            partint = tm.dt_year;
            break;
        case 2:    //q
            partint = tm.dt_season;
            break;
        case 3:    //m
            partint = tm.dt_month;
            break;
        case 4:    //y
            partint = tm.dt_yday;
            break;
        case 5:    //d
            partint = tm.dt_mday;
            break;
        case 6:    //w
            partint = tm.dt_week;
            break;
        case 7:    //ww
            partint = tm.dt_wweek;
            break;
        case 8:    //h
            partint = tm.dt_hour;
            break;
        case 9:    //n
            partint = tm.dt_minute;
            break;
        case 10:   //s
            partint = tm.dt_second;
            break;
    }

    return (short)partint ;
    }  //end datepart

    /*------------ Function: DatePart(interval, date, firstdayofweek) 3--------------*/
    public static short DATEPART(Variant varstr,Variant exp, Variant firstdayofweek) throws HpException
    {
	HCDateTimeStruct	    tm = new HCDateTimeStruct();
	double                  dbl=0;
    short                   strint=0;
    int                     firstdw ;

    String   str = hpstring.get_str( varstr );
    str = str.toLowerCase();
    if( str.compareTo("yyyy")==0    )
        strint = 1;
    else if( str.compareTo("q")==0  )
        strint = 2;
    else if( str.compareTo("m")==0  )
        strint = 3;
    else if( str.compareTo("y")==0  )

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?