一个自己封装的日期时间操作的用户对象

$PBExportHeader$nvo_datetime.sru $PBExportComments$日期时间操作类 forward global type nvo_datetime from nonvisualobject end type type stc_systemtime from structure within nvo_datetime end type end forward

type stc_systemtime from structure
	integer		wyear
	integer		wmonth
	integer		wdayofweek
	integer		wday
	integer		whour
	integer		wminute
	integer		wsecond
	integer		wmilliseconds
end type

global type nvo_datetime from nonvisualobject autoinstantiate
end type

type prototypes
Function long SetSystemTime(stc_systemtime lpSystemTime) Library "kernel32.dll" 
end prototypes

forward prototypes
public function integer of_getdaysinmonth (date ad_date)
public function date of_getlastdayinmonth (date ad_date)
public function date of_getlastdayinmonth (integer ai_year, integer ai_month)
public function date of_getfirstdayinmonth (date ad_date)
public function date of_getfirstdayinmonth (integer ai_year, integer ai_month)
public function boolean of_isleapyear (date ad_date)
public function boolean of_isleapyear (integer ai_year)
public function boolean of_lsweekend (date ad_date)
public function date of_skipholidays (date ad_date, integer ai_increment)
public function date of_getnextworkday (datawindow adw_holidays, string as_columnname, date ad_date)
public function date of_getpreviousworkday (datawindow adw_holidays, string as_columnname, date ad_date)
public function date of_getpreviousworkday (date ad_date)
public function date of_getnextworkday (date ad_date)
public function date of_skipholidays (datastore ads_holidays, string as_columnname, date ad_date, integer ai_increment)
public function date of_skipholidays (datawindow adw_holidays, string as_columnname, date ad_date, integer ai_increment)
public function date of_getnextworkday (datastore ads_holidays, string as_columnname, date ad_date)
public function date of_getfirstworkday (datawindow adw_holidays, string as_columnname, date ad_date)
public function date of_getfirstworkday (datastore ads_holidays, string as_columnname, date ad_date)
public function date of_getpreviousworkday (datastore ads_holidays, string as_columnname, date ad_date)
public function date of_getfirstworkday (date ad_date)
public function date of_getlastworkday (datastore ads_holidays, string as_columnname, date ad_date)
public function date of_getlastworkday (datawindow adw_holidays, string as_columnname, date ad_date)
public function date of_getlastworkday (date ad_date)
public function integer of_getdaysinmonth ()
public function integer of_countdowinmonth (date ad_date, integer ai_dow)
public function integer of_countdowinmonth (date ad_date)
public function integer of_countworkdays (datawindow adw_holidays, string as_columnname, date ad_startdate, date ad_enddate)
public function date of_getfirstdayinweek (date ad_date)
public function date of_getlastdayinweek (date ad_date)
public function date of_getfirstdayinmonth ()
public function date of_getlastdayinmonth ()
public function date of_getfirstworkday ()
public function date of_getlastworkday ()
public function date of_getfirstdayinweek ()
public function date of_getlastdayinweek ()
public function date of_getnextworkday ()
public function date of_getpreviousworkday ()
public function integer of_countholidays (datawindow adw_holidays, string as_columnname, date ad_startdate, date ad_enddate)
public function integer of_countholidays (date ad_startdate, date ad_enddate)
public function integer of_countholidays (datastore ads_holidays, string as_columnname, date ad_startdate, date ad_enddate)
public function integer of_countworkdays (datastore ads_holidays, string as_columnname, date ad_startdate, date ad_enddate)
public function integer of_countworkdays (date ad_startdate, date ad_enddate)
public function integer of_getage (date ad_brithday, date ad_date)
public function long of_yearsafter (date ad_start, date ad_end)
public function long of_monthsafter (date ad_start, date ad_end)
public function long of_weeksafter (date ad_start, date ad_end)
public function long of_secondsafter (datetime adtm_start, datetime adtm_end)
public function long of_millisecsafter (time atm_start, time atm_end)
public function date of_relativemonth (date ad_source, integer al_month)
public function datetime of_relativedatetime (datetime adtm_start, integer al_offset)
public function integer of_getquarter (date ad_source)
public function integer of_getquarter ()
public function date of_getfirstdayinquarter (date ad_date)
public function date of_getfirstdayinquarter ()
public function date of_getlastdayinquarter (date ad_date)
public function date of_getlastdayinquarter ()
public function long of_countweeksinyear (date ad_source)
public function integer of_getdayinweek (date ad_source)
public function date of_getfirstdayinyear (date ad_date)
public function date of_getfirstdayinyear ()
public function date of_getfirstdayinyear (integer ai_year)
public function date of_getlastdayinyear (date ad_date)
public function date of_getlastdayinyear ()
public function date of_getlastdayinyear (integer ai_year)
public function integer of_countyeardays (date ad_date)
public function integer of_countyeardays ()
public function integer of_countyeardays (integer ai_year)
public function string of_getconstellation (date ad_date)
public function string of_getgenus (integer ai_year)
public function string of_convertdayoflunar (date ad_date)
public function datetime of_relativedatetime (datetime ad_datetime, long al_number, string as_kind)
public function string of_gettgdz (integer ai_year)
public function string of_gettgdz (date ad_date)
public function string of_gettgdz ()
public function boolean of_isleapyear ()
public function string of_getgenus (date ad_date)
public function string of_getgenus ()
public function integer of_countdowinmonth ()
public function integer of_getage (date ad_brithday)
public function integer of_countdowinmonth (integer ai_dow)
public function long of_countweeksinyear ()
public function boolean of_setsystemtime (datetime adt_datetime)
end prototypes

public function integer of_getdaysinmonth (date ad_date);/*函数功能:获取指定日期所在月份的天数
  返回值:integer 指定日期所在月份的天数
  参数:ad_date date 日期*/
return integer(28+integer(mid('3'+string(abs(sign(mod(sign(mod(abs(year(ad_date)),4))+sign(mod(abs(year(ad_date)),100))+sign(mod(abs(year(ad_date)),400)),2)) -1))+'3232332323',month(ad_date),1)))

end function

public function date of_getlastdayinmonth (date ad_date);/*函数功能:获取指定日期所在月份的最后一天
  返回值:date 指定日期所在月份的最后一天
  参数:ad_date date 日期*/
return date(year(ad_date),month(ad_date),integer(28+integer(mid('3'+string(abs(sign(mod(sign(mod(abs(year(ad_date)),4))+sign(mod(abs(year(ad_date)),100))+sign(mod(abs(year(ad_date)),400)),2)) -1))+'3232332323',month(ad_date),1))))
end function

public function date of_getlastdayinmonth (integer ai_year, integer ai_month);/*函数功能:获取指定年份,月份的最后一天
  返回值:date 指定年份,月份的最后一天
  参数:integer ai_year  年份
        integer ai_month 月份*/
date ld_date
ld_date=date(ai_year,ai_month,1)
return date(year(ld_date),month(ld_date),integer(28+integer(mid('3'+string(abs(sign(mod(sign(mod(abs(year(ld_date)),4))+sign(mod(abs(year(ld_date)),100))+sign(mod(abs(year(ld_date)),400)),2)) -1))+'3232332323',month(ld_date),1))))
end function

public function date of_getfirstdayinmonth (date ad_date);/*函数功能:获取指定日期所在月份的第一天
  返回值:date 指定日期所在月份的第一天
  参数:date  ad_date  日期  */
return date(year(ad_date),month(ad_date),1)
end function

public function date of_getfirstdayinmonth (integer ai_year, integer ai_month);/*函数功能:获取指定年份,月份的第一天
  返回值:date 指定年份,月份的第一天
  参数:integer ai_year  年份
        integer ai_month 月份*/
return date(ai_year,ai_month,1)
end function

public function boolean of_isleapyear (date ad_date);/*函数功能:获取指定日期所在年份是否为闰年
  返回值:boolean  指定日期所在年份是否为闰年,true为是闰年,false为平年
  参数:ad_date date 日期*/
integer li_year
li_year=year(ad_date)
return abs(sign(mod(sign(mod(abs(li_year),4))+sign(mod(abs(li_year),100))+sign(mod(abs(li_year),400)),2)) -1)=1

end function

public function boolean of_isleapyear (integer ai_year);/*函数功能:获取指定年份是否为闰年
  返回值:boolean  指定年份是否为闰年,true为是闰年,false为平年
  参数:ai_year integer 年份*/
return abs(sign(mod(sign(mod(abs(ai_year),4))+sign(mod(abs(ai_year),100))+sign(mod(abs(ai_year),400)),2)) -1)=1

end function

public function boolean of_lsweekend (date ad_date);/*函数功能:获取指定日期是否为周末
  返回值:date 指定日期是否为周末
  参数:ad_date date 日期*/
string ls_week
ls_week=dayname(ad_date)
choose case dayname(ad_date)
	case "Saturday","Sunday"
		return true
	case else
		return false
end choose
end function

public function date of_skipholidays (date ad_date, integer ai_increment);/*函数功能:获取指定日期跳过周末的下一个日期
  返回值:date  返回指定的指定日期跳过周末的下一个日期
  参数:ad_date date 日期
  ai_increment integer 指定的跳过天数 */
date ld_date
ld_date=ad_date
do while of_lsweekend(ld_date)=true
	ld_date=RelativeDate ( ld_date, ai_increment )	
loop	
return ld_date
end function

public function date of_getnextworkday (datawindow adw_holidays, string as_columnname, date ad_date);/*函数功能:获取指定日期跳过周末和节假日的下一个工作日
  返回值:date  返回指定的指定日期跳过周末的下一个工作日
  参数:adw_holidays datawindow存储指定节假日的数据窗口
        as_columnname string 数据窗口中存储节假日的列名
        ad_date date 日期		  
		  */
return of_skipholidays(adw_holidays,as_columnname,RelativeDate (ad_date,1),1)
end function

public function date of_getpreviousworkday (datawindow adw_holidays, string as_columnname, date ad_date);/*函数功能:获取指定日期跳过周末和节假日的上一个工作日
  返回值:date  返回指定的指定日期跳过周末的上一个工作日
  参数:adw_holidays datawindow存储指定节假日的数据窗口
        as_columnname string 数据窗口中存储节假日的列名
        ad_date date 日期		  
		  */
return of_skipholidays(adw_holidays,as_columnname,RelativeDate (ad_date,-1),-1)
end function

public function date of_getpreviousworkday (date ad_date);/*函数功能:获取指定日期跳过周末的上一个工作日
  返回值:date  返回指定的指定日期跳过周末的上一个工作日  
  参数: ad_date date 日期	 */
return of_skipholidays(RelativeDate (ad_date,-1),-1)
end function

public function date of_getnextworkday (date ad_date);/*函数功能:获取指定日期跳过周末的下一个工作日
  返回值:date  返回指定的指定日期跳过周末的下一个工作日  
  参数: ad_date date 日期	 */
return of_skipholidays(RelativeDate (ad_date,1),1)
end function

public function date of_skipholidays (datastore ads_holidays, string as_columnname, date ad_date, integer ai_increment);/*函数功能:获取指定日期跳过周末和节假日的下一个日期
  返回值:date  返回指定的指定日期跳过周末和节假日的下一个日期
  参数:adw_holidays datastore存储指定节假日的数据存储对象
        as_columnname string 数据窗口中存储节假日的列名
        ad_date date 日期
		  ai_increment integer 指定的跳过天数
		  */
date ld_date
ld_date=ad_date
do while of_lsweekend(ld_date)=true or ads_holidays.find("string("+as_columnname+",'yyyy-mm-dd')"+"='"+string(ld_date,"yyyy-mm-dd")+"'",1,ads_holidays.rowcount())<>0
	ld_date=RelativeDate ( ld_date, ai_increment )	
loop	
return ld_date
end function

public function date of_skipholidays (datawindow adw_holidays, string as_columnname, date ad_date, integer ai_increment);/*函数功能:获取指定日期跳过周末和节假日的下一个日期
  返回值:date  返回指定的指定日期跳过周末和节假日的下一个日期
  参数:adw_holidays datawindow存储指定节假日的数据窗口
        as_columnname string 数据窗口中存储节假日的列名
        ad_date date 日期
		  ai_increment integer 指定的跳过天数
		  */
date ld_date
ld_date=ad_date
do while of_lsweekend(ld_date)=true or adw_holidays.find("string("+as_columnname+",'yyyy-mm-dd')"+"='"+string(ld_date,"yyyy-mm-dd")+"'",1,adw_holidays.rowcount())<>0
	ld_date=RelativeDate ( ld_date, ai_increment )	
loop	
return ld_date
end function

public function date of_getnextworkday (datastore ads_holidays, string as_columnname, date ad_date);/*函数功能:获取指定日期跳过周末和节假日的下一个工作日
  返回值:date  返回指定的指定日期跳过周末的下一个工作日
  参数:ads_holidays datastore存储指定节假日的数据存储对象
        as_columnname string 数据窗口中存储节假日的列名
        ad_date date 日期		  
		  */
return of_skipholidays(ads_holidays,as_columnname,RelativeDate (ad_date,1),1)
end function

public function date of_getfirstworkday (datawindow adw_holidays, string as_columnname, date ad_date);/*函数功能:获取指定日期所在月的第一个工作日
  返回值:date  返回指定日期所在月的第一个工作日
  参数:adw_holidays datawindow存储指定节假日的数据存储对象
        as_columnname string 数据窗口中存储节假日的列名
        ad_date date 日期		  
		  */
date d_temp
d_temp=date(year(ad_date),month(ad_date),1)
return of_skipholidays(adw_holidays,as_columnname,d_temp,1)
end function

public function date of_getfirstworkday (datastore ads_holidays, string as_columnname, date ad_date);/*函数功能:获取指定日期所在月的第一个工作日
  返回值:date  返回指定日期所在月的第一个工作日
  参数:ads_holidays datastore存储指定节假日的数据存储对象
        as_columnname string 数据窗口中存储节假日的列名
        ad_date date 日期		  
		  */
date d_temp
d_temp=date(year(ad_date),month(ad_date),1)
return of_skipholidays(ads_holidays,as_columnname,d_temp,1)
end function

public function date of_getpreviousworkday (datastore ads_holidays, string as_columnname, date ad_date);/*函数功能:获取指定日期跳过周末和节假日的上一个工作日
  返回值:date  返回指定的指定日期跳过周末的上一个工作日
  参数:ads_holidays datastore存储指定节假日的数据存储对象
        as_columnname string 数据窗口中存储节假日的列名
        ad_date date 日期		  
		  */
return of_skipholidays(ads_holidays,as_columnname,RelativeDate (ad_date,-1),-1)
end function

public function date of_getfirstworkday (date ad_date);/*函数功能:获取指定日期所在月的第一个工作日
  返回值:date  返回指定日期所在月的第一个工作日
  参数: ad_date date 日期 */
date d_temp
d_temp=date(year(ad_date),month(ad_date),1)
return of_skipholidays(d_temp,1)
end function

public function date of_getlastworkday (datastore ads_holidays, string as_columnname, date ad_date);/*函数功能:获取指定日期所在月的最后一个工作日
  返回值:date  返回指定日期所在月的最后一个工作日
  参数:ads_holidays datastore存储指定节假日的数据存储对象
        as_columnname string 数据窗口中存储节假日的列名
        ad_date date 日期		  
		  */
date d_temp
d_temp=of_getlastdayinmonth(ad_date)
return of_skipholidays(ads_holidays,as_columnname,d_temp,-1)
end function

public function date of_getlastworkday (datawindow adw_holidays, string as_columnname, date ad_date);/*函数功能:获取指定日期所在月的最后一个工作日
  返回值:date  返回指定日期所在月的最后一个工作日
  参数:adw_holidays datawindow存储指定节假日的数据窗口
        as_columnname string 数据窗口中存储节假日的列名
        ad_date date 日期		  
		  */
date d_temp
d_temp=of_getlastdayinmonth(ad_date)
return of_skipholidays(adw_holidays,as_columnname,d_temp,-1)
end function

public function date of_getlastworkday (date ad_date);/*函数功能:获取指定日期所在月的最后一个工作日
  返回值:date  返回指定日期所在月的最后一个工作日
  参数: ad_date date 日期	 */
date d_temp
d_temp=of_getlastdayinmonth(ad_date)
return of_skipholidays(d_temp,-1)
end function

public function integer of_getdaysinmonth ();/*函数功能:获取指定日期所在月份的天数
  返回值:integer 指定日期所在月份的天数
  参数:ad_date date 日期*/
return integer(28+integer(mid('3'+string(abs(sign(mod(sign(mod(abs(year(today())),4))+sign(mod(abs(year(today())),100))+sign(mod(abs(year(today())),400)),2)) -1))+'3232332323',month(today()),1)))

end function

public function integer of_countdowinmonth (date ad_date, integer ai_dow);/*函数功能:获取指定日期所在月份的指定星期几的天数
  返回值:integer 指定日期所在月份的指定星期几的天数
  参数:ad_date date 日期
         ai_dow integer 指定的星期几 1代表星期天......7代表星期六*/
date d_first
integer intcount,intmonth
if(ai_dow<1 or ai_dow>7) then
   ai_dow=daynumber(ad_date)
end if
intmonth=month(ad_date)
d_first=date(year(ad_date),month(ad_date),1)
do while daynumber(d_first)<>ai_dow
	d_first=relativedate(d_first,1)
loop
intcount=0
do while month(d_first)=intmonth
	intcount=intcount+1
	d_first=relativedate(d_first,7)
loop
return intcount


end function

public function integer of_countdowinmonth (date ad_date);/*函数功能:获取指定日期所在月份的星期一的天数
  返回值:integer 指定日期所在月份的星期一的天数
  参数:ad_date date 日期*/
  return of_countdowinmonth(ad_date,2)



end function

public function integer of_countworkdays (datawindow adw_holidays, string as_columnname, date ad_startdate, date ad_enddate);/*函数功能:获取指定日期之间的工作日天数
  返回值:工作日天数
  参数:adw_holidays datawindow存储指定节假日的数据窗口
        as_columnname string 数据窗口中存储节假日的列名
        ad_startdate date 开始日期
		  ad_enddate date 结束日期 */		
integer intdays,li_return
date d_temp
integer intsubstract
if ad_enddate
   1<ad_startdate ad_enddate="of_skipholidays(adw_holidays,as_columnname,ad_enddate,-1)" ad_startdate="" d_temp="ad_startdate" end="" if="" then="">ad_enddate then
   2    	li_return=0
   3    else
   4    	intdays=DaysAfter (ad_startdate, ad_enddate )+1
   5    	intsubstract=intsubstract+of_countholidays(adw_holidays,as_columnname,ad_startdate,ad_enddate)
   6    end if
   7    li_return=intdays - intsubstract
   8    return li_return
   9    end function
  10    
  11    public function date of_getfirstdayinweek (date ad_date);/*函数功能:获取指定日期所在周的第一天
  12      返回值:date  返回指定日期所在周的第一天
  13      参数:ad_date date 日期 */
  14    date ld_return
  15    ld_return=RelativeDate (ad_date, 1 - daynumber(ad_date))
  16    return ld_return
  17    end function
  18    
  19    public function date of_getlastdayinweek (date ad_date);/*函数功能:获取指定日期所在周的最后一天
  20      返回值:date  返回指定日期所在周的最后一天
  21      参数:ad_date date 日期 */
  22    date ld_return
  23    ld_return=RelativeDate (ad_date, 7 - daynumber(ad_date))
  24    return ld_return
  25    end function
  26    
  27    public function date of_getfirstdayinmonth ();/*函数功能:获取当前日期所在月份的第一天
  28      返回值:date 当前日期所在月份的第一天
  29      参数:date  ad_date  日期  */
  30    return date(year(today()),month(today()),1)
  31    end function
  32    
  33    public function date of_getlastdayinmonth ();/*函数功能:获取当前日期所在月份的最后一天
  34      返回值:date 当前日期所在月份的最后一天*/
  35    return date(year(today()),month(today()),integer(28+integer(mid('3'+string(abs(sign(mod(sign(mod(abs(year(today())),4))+sign(mod(abs(year(today())),100))+sign(mod(abs(year(today())),400)),2)) -1))+'3232332323',month(today()),1))))
  36    end function
  37    
  38    public function date of_getfirstworkday ();/*函数功能:获取当前日期所在月的第一个工作日
  39      返回值:date  返回当前日期所在月的第一个工作日 */
  40    date d_temp
  41    d_temp=date(year(today()),month(today()),1)
  42    return of_skipholidays(d_temp,1)
  43    end function
  44    
  45    public function date of_getlastworkday ();/*函数功能:获取当前日期所在月的最后一个工作日
  46      返回值:date  返回当前日期所在月的最后一个工作日 */
  47      date d_temp
  48    d_temp=of_getlastdayinmonth(today())
  49    return of_skipholidays(d_temp,-1)
  50    end function
  51    
  52    public function date of_getfirstdayinweek ();/*函数功能:获取当前日期所在周的第一天
  53      返回值:date  返回当前日期所在周的第一天
  54      参数:ad_date date 日期 */
  55    date ld_return
  56    ld_return=RelativeDate (today(), 1 - daynumber(today()))
  57    return ld_return
  58    end function
  59    
  60    public function date of_getlastdayinweek ();/*函数功能:获取指定日期所在周的最后一天
  61      返回值:date  返回指定日期所在周的最后一天*/
  62    date ld_return
  63    ld_return=RelativeDate (today(), 7 - daynumber(today()))
  64    return ld_return
  65    end function
  66    
  67    public function date of_getnextworkday ();/*函数功能:获取当前日期跳过周末的下一个工作日
  68      返回值:date  返回当前的指定日期跳过周末的下一个工作日  */
  69    return of_skipholidays(RelativeDate (today(),1),1)
  70    end function
  71    
  72    public function date of_getpreviousworkday ();/*函数功能:获取当前日期跳过周末的上一个工作日
  73      返回值:date  返回当前日期跳过周末的上一个工作日 */
  74    return of_skipholidays(RelativeDate (today(),-1),-1)
  75    end function
  76    
  77    public function integer of_countholidays (datawindow adw_holidays, string as_columnname, date ad_startdate, date ad_enddate);/*函数功能:获取指定日期之间的节假日天数
  78      返回值:节假日天数
  79      参数:adw_holidays datawindow存储指定节假日的数据窗口
  80            as_columnname string 数据窗口中存储节假日的列名
  81            ad_startdate date 开始日期
  82    		  ad_enddate date 结束日期 */		 
  83    integer li_return
  84    date ld_date
  85    ld_date=ad_startdate
  86    do while ld_date&lt;=ad_enddate
  87    	if of_lsweekend(ld_date)=true or adw_holidays.find("string("+as_columnname+",'yyyy-mm-dd')"+"='"+string(ld_date,"yyyy-mm-dd")+"'",1,adw_holidays.rowcount())=0 then
  88    		li_return++	
  89    	end if
  90    	ld_date=relativedate(ld_date,1)	
  91    loop	
  92    return li_return
  93    end function
  94    
  95    public function integer of_countholidays (date ad_startdate, date ad_enddate);/*函数功能:获取指定日期之间的节假日天数
  96      返回值:节假日天数
  97      参数:ad_startdate date 开始日期
  98    		  ad_enddate date 结束日期 */		 
  99    integer li_return
 100    date ld_date
 101    ld_date=ad_startdate
 102    do while ld_date&lt;=ad_enddate
 103    	if of_lsweekend(ld_date)=true then
 104    		li_return++	
 105    	end if
 106    	ld_date=relativedate(ld_date,1)	
 107    loop	
 108    return li_return
 109    end function
 110    
 111    public function integer of_countholidays (datastore ads_holidays, string as_columnname, date ad_startdate, date ad_enddate);/*函数功能:获取指定日期之间的节假日天数
 112      返回值:节假日天数
 113      参数:ads_holidays datastore存储指定节假日的数据存储对象
 114            as_columnname string 数据窗口中存储节假日的列名
 115            ad_startdate date 开始日期
 116    		  ad_enddate date 结束日期 */		 
 117    integer li_return
 118    date ld_date
 119    ld_date=ad_startdate
 120    do while ld_date&lt;=ad_enddate
 121    	if of_lsweekend(ld_date)=true or ads_holidays.find("string("+as_columnname+",'yyyy-mm-dd')"+"='"+string(ld_date,"yyyy-mm-dd")+"'",1,ads_holidays.rowcount())=0 then
 122    		li_return++	
 123    	end if
 124    	ld_date=relativedate(ld_date,1)	
 125    loop	
 126    return li_return
 127    end function
 128    
 129    public function integer of_countworkdays (datastore ads_holidays, string as_columnname, date ad_startdate, date ad_enddate);/*函数功能:获取指定日期之间的工作日天数
 130      返回值:工作日天数
 131      参数:ads_holidays datastroe存储指定节假日的数据存储对象
 132            as_columnname string 数据窗口中存储节假日的列名
 133            ad_startdate date 开始日期
 134    		  ad_enddate date 结束日期 */		
 135    integer intdays,li_return
 136    date d_temp
 137    integer intsubstract
 138    if ad_enddate<ad_startdate ad_enddate="of_skipholidays(ads_holidays,as_columnname,ad_enddate,-1)" ad_startdate="" d_temp="ad_startdate" end="" if="" then="">ad_enddate then
 139    	li_return=0
 140    else
 141    	intdays=DaysAfter (ad_startdate, ad_enddate )+1
 142    	intsubstract=intsubstract+of_countholidays(ads_holidays,as_columnname,ad_startdate,ad_enddate)
 143    end if
 144    li_return=intdays - intsubstract
 145    return li_return
 146    end function
 147    
 148    public function integer of_countworkdays (date ad_startdate, date ad_enddate);/*函数功能:获取指定日期之间的工作日天数
 149      返回值:工作日天数
 150      参数:ad_startdate date 开始日期
 151    		  ad_enddate date 结束日期 */		
 152    integer intdays,li_return
 153    date d_temp
 154    integer intsubstract
 155    if ad_enddate<ad_startdate ad_enddate="of_skipholidays(ad_enddate,-1)" ad_startdate="" d_temp="ad_startdate" end="" if="" then="">ad_enddate then
 156    	li_return=0
 157    else
 158    	intdays=DaysAfter (ad_startdate, ad_enddate )+1
 159    	intsubstract=intsubstract+of_countholidays(ad_startdate,ad_enddate)
 160    end if
 161    li_return=intdays - intsubstract
 162    return li_return
 163    end function
 164    
 165    public function integer of_getage (date ad_brithday, date ad_date);/*函数作用:获取指定生日到指定日期的年纪
 166      函数返回值:integer 指定生日到指定日期的年纪
 167      参数:date ad_brithday 出生日期
 168           date ad_date 指定日期*/
 169    integer li_age
 170    date ld_temp
 171    if ad_brithday&gt;ad_date then
 172    	ld_temp=ad_brithday
 173    	ad_brithday=ad_date
 174    	ad_date=ld_temp
 175    end if
 176    li_age=of_yearsafter(ad_brithday,ad_date)
 177    if ad_date<date(year(ad_date),month(ad_brithday),day(ad_brithday)) (date="" (ll_null)="" *函数用途:获取指定日期之间的相差年度="" -="" 1="" ad_end="" ad_end);="" ad_start="" ad_start,="" adb_end="" adb_start,="" date="" double="" end="" function="" if="" int="" isnull(ad_end)="" isnull(ad_start)="" ld_temp="" li_age="" li_mult="" li_year,="" ll_null="" long="" of_yearsafter="" or="" public="" return="" setnull="" then="" 参数:date="" 开始日期="" 相差年度="" 结束日期*="" 返回值:long=""> ad_end Then
 178    	ld_temp = ad_start
 179    	ad_start = ad_end
 180    	ad_end = ld_temp
 181    	li_mult = -1
 182    else
 183    	li_mult = 1
 184    End If
 185    li_year = year(ad_end) - year(ad_start)
 186    adb_start = month(ad_start)
 187    adb_start = adb_start + day(ad_start) / 100
 188    adb_end = month(ad_end)
 189    adb_end = adb_end + day(ad_end) / 100
 190    If adb_start &gt; adb_end Then
 191    	li_year --
 192    End If
 193    Return li_year * li_mult
 194    
 195    end function
 196    
 197    public function long of_monthsafter (date ad_start, date ad_end);/* 描述: 两个日期之间的月份间隔
 198    返回:	两个日期之间的月份间隔
 199    参数:date 	ad_start 开始日期
 200    	  date 	ad_end	结束日期  */   
 201    date 		ld_temp
 202    integer 	li_month
 203    integer	li_mult
 204    
 205    If IsNull(ad_start) or IsNull(ad_end) Then
 206    	long ll_null
 207    	SetNull(ll_null)
 208    	Return ll_null
 209    End If
 210    If ad_start &gt; ad_end Then
 211    	ld_temp = ad_start
 212    	ad_start = ad_end
 213    	ad_end = ld_temp
 214    	li_mult = -1
 215    else
 216    	li_mult = 1
 217    End If
 218    li_month = (year(ad_end) - year(ad_start) ) * 12
 219    li_month = li_month + month(ad_end) - month(ad_start)
 220    
 221    If day(ad_start) &gt; day(ad_end) Then 
 222    	li_month --
 223    End If
 224    Return li_month * li_mult
 225    end function
 226    
 227    public function long of_weeksafter (date ad_start, date ad_end);/*函数用途:获取指定日期之间的相差星期数
 228     返回值:long 相差星期数
 229     参数:date ad_start 开始日期
 230          date ad_end 结束日期*/	
 231    If IsNull(ad_start) or IsNull(ad_end) Then
 232    	long ll_null
 233    	SetNull(ll_null)
 234    	Return ll_null
 235    End If
 236    Return Daysafter(ad_start,ad_end) /7
 237    end function
 238    
 239    public function long of_secondsafter (datetime adtm_start, datetime adtm_end);/*函数用途:获取指定日期之间的相差分钟数
 240     返回值:long 相差分钟数
 241     参数:datetime adtm_start 开始时间
 242          datetime adtm_end 结束时间*/		
 243    long ll_total_seconds, ll_day_adjust
 244    date ld_sdate, ld_edate
 245    time lt_stime, lt_etime
 246    If IsNull(adtm_start) or IsNull(adtm_end) Then
 247    	long ll_null
 248    	SetNull(ll_null)
 249    	Return ll_null
 250    End If
 251    ld_sdate = date(adtm_start)
 252    ld_edate = date(adtm_end)
 253    lt_stime = time(adtm_start)
 254    lt_etime = time(adtm_end)
 255    If ld_sdate = ld_edate then 
 256    	ll_total_seconds = secondsafter(	lt_stime,lt_etime)
 257    Elseif ld_sdate &lt; ld_edate Then
 258    	ll_total_seconds = SecondsAfter(lt_stime,Time('23:59:59'))
 259    	ll_day_adjust = DaysAfter(ld_sdate,ld_edate) -1
 260    	If ll_day_adjust &gt; 0 Then ll_total_seconds = ll_total_seconds + 86400 * ll_day_adjust
 261    	ll_total_seconds = ll_total_seconds + SecondsAfter(Time('00:00:00'),lt_etime) +1
 262    Else 
 263    	ll_total_seconds = SecondsAfter(lt_stime,Time('00:00:00'))
 264    	ll_day_adjust = DaysAfter(ld_sdate,ld_edate) +1
 265    	If ll_day_adjust &lt; 0 Then ll_total_seconds = ll_total_seconds + 86400 * ll_day_adjust
 266    	ll_total_seconds = ll_total_seconds + SecondsAfter(Time('23:59:59'),lt_etime) -1
 267    end If
 268    
 269    return ll_total_seconds
 270    
 271    end function
 272    
 273    public function long of_millisecsafter (time atm_start, time atm_end);/*函数用途:获取指定时间之间的相差秒数
 274     返回值:long 相差相差秒数
 275     参数:time atm_start 开始时间
 276          time atm_end 结束时间*/	
 277    Long ll_start, ll_end
 278    Long ll_temp
 279    If IsNull(atm_start) or IsNull(atm_end) Then
 280    	long ll_null
 281    	SetNull(ll_null)
 282    	Return ll_null
 283    End If
 284    ll_start = Long (String (atm_start,"fff"))
 285    ll_temp = Second(atm_start) * 1000
 286    ll_start = ll_start + ll_temp
 287    ll_temp = Minute(atm_start) * 60000
 288    ll_start = ll_start + ll_temp
 289    ll_temp = hour(atm_start) *  3600000
 290    ll_start = ll_start + ll_temp
 291    ll_end = Long (String (atm_end,"fff"))
 292    ll_temp = Second(atm_end) * 1000
 293    ll_end = ll_end + ll_temp
 294    ll_temp = minute(atm_end) * 60000
 295    ll_end = ll_end + ll_temp
 296    ll_temp = hour(atm_end) * 3600000
 297    ll_end = ll_end + ll_temp
 298    return ll_end - ll_start
 299    end function
 300    
 301    public function date of_relativemonth (date ad_source, integer al_month);/*函数功能:返回指定日期相差指定月份后的日期
 302    返回值:date 指定日期相差指定月份后的日期
 303    参数:date ad_source 初始日期
 304         integer al_month 月数*/
 305    integer li_adjust_months, li_adjust_years
 306    integer li_month, li_year, li_day
 307    integer li_temp_month
 308    If IsNull(ad_source) or IsNull(al_month) Then
 309    	date ldt_null
 310    	SetNull(ldt_null)
 311    	Return ldt_null
 312    End If
 313    li_adjust_months = mod(al_month, 12)
 314    li_adjust_years = (al_month / 12)
 315    li_temp_month = Month(ad_source) + li_adjust_months
 316    If li_temp_month &gt; 12 Then	
 317    	li_month = li_temp_month - 12
 318    	li_adjust_years ++
 319    ElseIf li_temp_month &lt;= 0 Then	
 320    	li_month = li_temp_month + 12
 321    	li_adjust_years --
 322    Else
 323    	li_month = li_temp_month
 324    End If
 325    li_year = Year(ad_source) + li_adjust_years
 326    li_day = Day(ad_source)
 327    Do While li_day &gt; 0
 328    	li_day --
 329    Loop
 330    Date		ld_Ret 
 331    ld_Ret = Date(li_year, li_month, li_day) 
 332    Return  ld_Ret
 333    end function
 334    
 335    public function datetime of_relativedatetime (datetime adtm_start, integer al_offset);/*函数功能:返回指定时间相差指定秒数后的时间
 336    返回值:datetime 指定时间相差指定秒数后的时间
 337    参数:datetime adtm_start 初始时间
 338         integer al_month 秒数*/
 339    datetime ldt_null
 340    date ld_sdate
 341    time lt_stime
 342    long ll_date_adjust
 343    long ll_time_adjust, ll_time_test
 344    If IsNull(adtm_start) or IsNull(al_offset) Then
 345    	SetNull(ldt_null)
 346    	Return ldt_null
 347    End If
 348    ld_sdate = date(adtm_start)
 349    lt_stime = time(adtm_start)
 350    ll_date_adjust = al_offset /  86400
 351    ll_time_adjust = mod(al_offset, 86400)
 352    ld_sdate = RelativeDate(ld_sdate, ll_date_adjust)
 353    If ll_time_adjust &gt; 0 then
 354    	ll_time_test = SecondsAfter(lt_stime,time('23:59:59'))
 355    	If ll_time_test &lt; ll_time_adjust Then
 356    		ld_sdate = RelativeDate(ld_sdate,1)
 357    		ll_time_adjust = ll_time_adjust - ll_time_test -1
 358    		lt_stime = time('00:00:00')
 359    	End If
 360    	lt_stime = RelativeTime(lt_stime, ll_time_adjust)
 361    ElseIf  ll_time_adjust &lt; 0 then
 362    	ll_time_test = SecondsAfter(lt_stime,time('00:00:00'))
 363    	If   ll_time_test &gt; ll_time_adjust Then
 364    		ld_sdate = RelativeDate(ld_sdate,-1)
 365    		ll_time_adjust = ll_time_adjust - ll_time_test +1
 366    		lt_stime = time('23:59:59')
 367    	End If
 368    	lt_stime = RelativeTime(lt_stime, ll_time_adjust)
 369    End If
 370    return(datetime(ld_sdate,lt_stime))
 371    end function
 372    
 373    public function integer of_getquarter (date ad_source);/*函数功能:获得指定日期所在的季度
 374    返回值:integer 指定日期所在的季度
 375    参数:date ad_source日期*/
 376    IF IsNull(ad_source) THEN
 377    	Long ll_null
 378    	SetNull(ll_null)
 379    	Return ll_null
 380    END IF
 381    Integer li_Month , li_Quarter
 382    li_Month = Month(ad_Source)
 383    li_Quarter = (li_Month -1)/3
 384    Return li_Quarter
 385    
 386    end function
 387    
 388    public function integer of_getquarter ();/*函数功能:获得当前日期所在的季度
 389    返回值:integer 当前日期所在的季度*/
 390    Integer li_Month , li_Quarter
 391    li_Month = Month(today())
 392    li_Quarter = (li_Month -1)/3
 393    Return li_Quarter
 394    
 395    end function
 396    
 397    public function date of_getfirstdayinquarter (date ad_date);/*函数用途:获取指定日期所在的季度的第一天
 398    返回值:date 指定日期所在的季度的第一天
 399    参数:date ad_date 指定日期*/
 400    date ld_return
 401    constant integer li_monthsinquarter=3
 402    ld_return=date(year(ad_date),int((month(ad_date) - 1)/li_monthsinquarter)*li_monthsinquarter+1,1)
 403    return ld_return
 404    end function
 405    
 406    public function date of_getfirstdayinquarter ();/*函数用途:获取当前日期所在的季度的第一天
 407    返回值:date 当前日期所在的季度的第一天*/
 408    date ld_return
 409    constant integer li_monthsinquarter=3
 410    ld_return=date(year(today()),int((month(today()) - 1)/li_monthsinquarter)*li_monthsinquarter+1,1)
 411    return ld_return
 412    end function
 413    
 414    public function date of_getlastdayinquarter (date ad_date);/*函数用途:获取指定日期所在的季度的最后一天
 415    返回值:date 指定日期所在的季度的最后一天
 416    参数:date ad_date 指定日期*/
 417    date ld_return
 418    constant integer li_monthsinquarter=3
 419    ld_return=date(year(ad_date),int((month(ad_date) - 1)/li_monthsinquarter)*li_monthsinquarter+(li_monthsinquarter+1),integer(28+integer(mid('3'+string(abs(sign(mod(sign(mod(abs(year(ad_date)),4))+sign(mod(abs(year(ad_date)),100))+sign(mod(abs(year(ad_date)),400)),2)) -1))+'3232332323',month(ad_date),1))))
 420    return ld_return
 421    end function
 422    
 423    public function date of_getlastdayinquarter ();/*函数用途:获取当前日期所在的季度的最后一天
 424    返回值:date 当前日期所在的季度的最后一天*/
 425    date ld_return
 426    constant integer li_monthsinquarter=3
 427    ld_return=date(year(today()),int((month(today()) - 1)/li_monthsinquarter)*li_monthsinquarter+(li_monthsinquarter+1),integer(28+integer(mid('3'+string(abs(sign(mod(sign(mod(abs(year(today())),4))+sign(mod(abs(year(today())),100))+sign(mod(abs(year(today())),400)),2)) -1))+'3232332323',month(today()),1))))
 428    return ld_return
 429    end function
 430    
 431    public function long of_countweeksinyear (date ad_source);/*函数用途:获取指定日期所在年份的星期数
 432    返回值:long 返回日期所在年份的星期数
 433    参数:date ad_source 指定日期*/
 434    date		ld_first_ofyear
 435    integer	li_weeknumber
 436    integer	li_leftover_days
 437    If IsNull(ad_source) Then
 438    	long ll_null
 439    	SetNull(ll_null)
 440    	Return ll_null
 441    End If
 442    ld_first_ofyear = Date(Year(ad_source), 1, 1)
 443    li_weeknumber = of_WeeksAfter (ld_first_ofyear, ad_source) + 1 
 444    li_leftover_days = Mod(DaysAfter (ld_first_ofyear, ad_source), 7)
 445    If (of_getdayinweek(ld_first_ofyear) + li_leftover_days) &gt;= 8 then
 446    	li_weeknumber ++
 447    End If
 448    Return li_weeknumber
 449    end function
 450    
 451    public function integer of_getdayinweek (date ad_source);// 描述: 决定日期是星期几,以星期天作为一个星期的第一天
 452    // 参数:	
 453    //		[value] 	date 	ad_source		&lt;描述&gt;
 454    // 返回:	(INTEGER) 
 455    //						1 - If the Day is Sunday.
 456    //						2 - If the Day is Monday
 457    //						3 - If the Day is Tuesday.
 458    //						4 - If the Day is Wednesday.
 459    //						5 - If the Day is Thursday.
 460    //						6 - If the Day is Friday.
 461    //						7 - If the Day is Saturday.
 462    //						If any argument's value is NULL, function returns NULL.
 463    //
 464    If IsNull(ad_source) Then
 465    	long ll_null
 466    	SetNull(ll_null)
 467    	Return ll_null
 468    End If
 469    return DayNumber (ad_source)
 470    
 471    end function
 472    
 473    public function date of_getfirstdayinyear (date ad_date);/*函数功能:获取指定日期所在年份的第一天
 474      返回值:date 指定日期所在年份的第一天
 475      参数:date  ad_date  日期  */
 476    return date(year(ad_date),1,1)
 477    end function
 478    
 479    public function date of_getfirstdayinyear ();/*函数功能:获取当前日期所在年份的第一天
 480      返回值:date 当前日期所在年份的第一天
 481      参数:date  ad_date  日期  */
 482    return date(year(today()),1,1)
 483    end function
 484    
 485    public function date of_getfirstdayinyear (integer ai_year);/*函数功能:获取指定年份的第一天
 486      返回值:date 指定年份的第一天
 487      参数:date  ad_date  日期  */
 488    return date(ai_year,1,1)
 489    end function
 490    
 491    public function date of_getlastdayinyear (date ad_date);/*函数功能:获取指定日期所在年份的最后一天
 492      返回值:date 指定日期所在年份的最后一天
 493      参数:date  ad_date  日期  */
 494    return date(year(ad_date),12,31)
 495    end function
 496    
 497    public function date of_getlastdayinyear ();/*函数功能:获取当前日期所在年份的最后一天
 498      返回值:date 当前日期所在年份的最后一天
 499      参数:date  ad_date  日期  */
 500    return date(year(today()),12,31)
 501    end function
 502    
 503    public function date of_getlastdayinyear (integer ai_year);/*函数功能:获取指定日期所在年份的最后一天
 504      返回值:date 指定日期所在年份的最后一天
 505      参数:integer  ai_year  年份  */
 506    return date(ai_year,12,31)
 507    end function
 508    
 509    public function integer of_countyeardays (date ad_date);/*函数用途:获取指定日期所在年份的天数
 510    函数返回值:integer 天数
 511    参数:date ad_date 日期*/
 512    return daysafter(of_getfirstdayinyear(ad_date),of_getlastdayinyear(ad_date))
 513    end function
 514    
 515    public function integer of_countyeardays ();/*函数用途:获取当前日期所在年份的天数
 516    函数返回值:integer 天数*/
 517    return daysafter(of_getfirstdayinyear(),of_getlastdayinyear())
 518    end function
 519    
 520    public function integer of_countyeardays (integer ai_year);/*函数用途:获取指定年份的天数
 521    函数返回值:integer 天数
 522    参数:integer ai_year 年份*/
 523    return daysafter(of_getfirstdayinyear(ai_year),of_getlastdayinyear(ai_year))
 524    end function
 525    
 526    public function string of_getconstellation (date ad_date);/*函数用途:返回指定日期所在星座
 527    返回值:string 指定日期所在星座
 528    参数:date ad_date 指定日期*/
 529    return mid("摩羯水瓶双鱼白羊金牛双子巨蟹狮子处女天秤天蝎射手摩羯",(month(ad_date)+sign(sign(day(ad_date) -(19+integer(mid('102123444423',month(ad_date),1))))+1))*4 -3,4)+'座'
 530    end function
 531    
 532    public function string of_getgenus (integer ai_year);/*函数功能:获取指定年份的生肖
 533      返回值:string 返回指定的年份的生肖
 534      参数:ai_year integer 年份*/
 535    string ls_return
 536    setnull(ls_return)
 537    if ai_year &lt;1900 then  return ls_return	
 538    ls_return=mid(fill('鼠牛虎兔龙蛇马羊猴鸡狗猪',48),(mod(ai_year -1900,12)+13)*2 -1,2)
 539    return ls_return
 540    end function
 541    
 542    public function string of_convertdayoflunar (date ad_date);string WeekName[0 to 7],TianGan[0 to 9],DiZhi[0 to 11],ShuXiang[0 to 11],DayName[0 to 30],MonName[0 to 12]
 543    long MonthAdd[0 to 11],NongliData[0 to 99]
 544    long  curTime, curYear, curMonth, curDay, curWeekday
 545    string GongliStr, WeekdayStr, NongliStr, NongliDayStr
 546    long i, m, n, k, isEnd, bit,thedate
 547    WeekName[0] = " * "
 548    WeekName[1] = "星期日"
 549    WeekName[2] = "星期一"
 550    WeekName[3] = "星期二"
 551    WeekName[4] = "星期三"
 552    WeekName[5] = "星期四"
 553    WeekName[6] = "星期五"
 554    WeekName[7] = "星期六"
 555    
 556    //天干名称
 557    TianGan[0] = "甲"
 558    TianGan[1] = "乙"
 559    TianGan[2] = "丙"
 560    TianGan[3] = "丁"
 561    TianGan[4] = "戊"
 562    TianGan[5] = "己"
 563    TianGan[6] = "庚"
 564    TianGan[7] = "辛"
 565    TianGan[8] = "壬"
 566    TianGan[9] = "癸"
 567    
 568    //地支名称
 569    DiZhi[0] = "子"
 570    DiZhi[1] = "丑"
 571    DiZhi[2] = "寅"
 572    DiZhi[3] = "卯"
 573    DiZhi[4] = "辰"
 574    DiZhi[5] = "巳"
 575    DiZhi[6] = "午"
 576    DiZhi[7] = "未"
 577    DiZhi[8] = "申"
 578    DiZhi[9] = "酉"
 579    DiZhi[10] = "戌"
 580    DiZhi[11] = "亥"
 581    
 582    //属相名称
 583    ShuXiang[0] = "鼠"
 584    ShuXiang[1] = "牛"
 585    ShuXiang[2] = "虎"
 586    ShuXiang[3] = "兔"
 587    ShuXiang[4] = "龙"
 588    ShuXiang[5] = "蛇"
 589    ShuXiang[6] = "马"
 590    ShuXiang[7] = "羊"
 591    ShuXiang[8] = "猴"
 592    ShuXiang[9] = "鸡"
 593    ShuXiang[10] = "狗"
 594    ShuXiang[11] = "猪"
 595    
 596    //农历日期名
 597    DayName[0] = "*"
 598    DayName[1] = "初一"
 599    DayName[2] = "初二"
 600    DayName[3] = "初三"
 601    DayName[4] = "初四"
 602    DayName[5] = "初五"
 603    DayName[6] = "初六"
 604    DayName[7] = "初七"
 605    DayName[8] = "初八"
 606    DayName[9] = "初九"
 607    DayName[10] = "初十"
 608    DayName[11] = "十一"
 609    DayName[12] = "十二"
 610    DayName[13] = "十三"
 611    DayName[14] = "十四"
 612    DayName[15] = "十五"
 613    DayName[16] = "十六"
 614    DayName[17] = "十七"
 615    DayName[18] = "十八"
 616    DayName[19] = "十九"
 617    DayName[20] = "二十"
 618    DayName[21] = "廿一"
 619    DayName[22] = "廿二"
 620    DayName[23] = "廿三"
 621    DayName[24] = "廿四"
 622    DayName[25] = "廿五"
 623    DayName[26] = "廿六"
 624    DayName[27] = "廿七"
 625    DayName[28] = "廿八"
 626    DayName[29] = "廿九"
 627    DayName[30] = "三十"
 628    
 629    //农历月份名
 630    MonName[0] = "*"
 631    MonName[1] = "正"
 632    MonName[2] = "二"
 633    MonName[3] = "三"
 634    MonName[4] = "四"
 635    MonName[5] = "五"
 636    MonName[6] = "六"
 637    MonName[7] = "七"
 638    MonName[8] = "八"
 639    MonName[9] = "九"
 640    MonName[10] = "十"
 641    MonName[11] = "十一"
 642    MonName[12] = "腊"
 643    
 644    //公历每月前面的天数
 645    MonthAdd[0] = 0
 646    MonthAdd[1] = 31
 647    MonthAdd[2] = 59
 648    MonthAdd[3] = 90
 649    MonthAdd[4] = 120
 650    MonthAdd[5] = 151
 651    MonthAdd[6] = 181
 652    MonthAdd[7] = 212
 653    MonthAdd[8] = 243
 654    MonthAdd[9] = 273
 655    MonthAdd[10] = 304
 656    MonthAdd[11] = 334
 657    
 658    //农历数据
 659    NongliData[0] = 2635
 660    NongliData[1] = 333387
 661    NongliData[2] = 1701
 662    NongliData[3] = 1748
 663    NongliData[4] = 267701
 664    NongliData[5] = 694
 665    NongliData[6] = 2391
 666    NongliData[7] = 133423
 667    NongliData[8] = 1175
 668    NongliData[9] = 396438
 669    NongliData[10] = 3402
 670    NongliData[11] = 3749
 671    NongliData[12] = 331177
 672    NongliData[13] = 1453
 673    NongliData[14] = 694
 674    NongliData[15] = 201326
 675    NongliData[16] = 2350
 676    NongliData[17] = 465197
 677    NongliData[18] = 3221
 678    NongliData[19] = 3402
 679    NongliData[20] = 400202
 680    NongliData[21] = 2901
 681    NongliData[22] = 1386
 682    NongliData[23] = 267611
 683    NongliData[24] = 605
 684    NongliData[25] = 2349
 685    NongliData[26] = 137515
 686    NongliData[27] = 2709
 687    NongliData[28] = 464533
 688    NongliData[29] = 1738
 689    NongliData[30] = 2901
 690    NongliData[31] = 330421
 691    NongliData[32] = 1242
 692    NongliData[33] = 2651
 693    NongliData[34] = 199255
 694    NongliData[35] = 1323
 695    NongliData[36] = 529706
 696    NongliData[37] = 3733
 697    NongliData[38] = 1706
 698    NongliData[39] = 398762
 699    NongliData[40] = 2741
 700    NongliData[41] = 1206
 701    NongliData[42] = 267438
 702    NongliData[43] = 2647
 703    NongliData[44] = 1318
 704    NongliData[45] = 204070
 705    NongliData[46] = 3477
 706    NongliData[47] = 461653
 707    NongliData[48] = 1386
 708    NongliData[49] = 2413
 709    NongliData[50] = 330077
 710    NongliData[51] = 1197
 711    NongliData[52] = 2637
 712    NongliData[53] = 268877
 713    NongliData[54] = 3365
 714    NongliData[55] = 531109
 715    NongliData[56] = 2900
 716    NongliData[57] = 2922
 717    NongliData[58] = 398042
 718    NongliData[59] = 2395
 719    NongliData[60] = 1179
 720    NongliData[61] = 267415
 721    NongliData[62] = 2635
 722    NongliData[63] = 661067
 723    NongliData[64] = 1701
 724    NongliData[65] = 1748
 725    NongliData[66] = 398772
 726    NongliData[67] = 2742
 727    NongliData[68] = 2391
 728    NongliData[69] = 330031
 729    NongliData[70] = 1175
 730    NongliData[71] = 1611
 731    NongliData[72] = 200010
 732    NongliData[73] = 3749
 733    NongliData[74] = 527717
 734    NongliData[75] = 1452
 735    NongliData[76] = 2742
 736    NongliData[77] = 332397
 737    NongliData[78] = 2350
 738    NongliData[79] = 3222
 739    NongliData[80] = 268949
 740    NongliData[81] = 3402
 741    NongliData[82] = 3493
 742    NongliData[83] = 133973
 743    NongliData[84] = 1386
 744    NongliData[85] = 464219
 745    NongliData[86] = 605
 746    NongliData[87] = 2349
 747    NongliData[88] = 334123
 748    NongliData[89] = 2709
 749    NongliData[90] = 2890
 750    NongliData[91] = 267946
 751    NongliData[92] = 2773
 752    NongliData[93] = 592565
 753    NongliData[94] = 1210
 754    NongliData[95] = 2651
 755    NongliData[96] = 395863
 756    NongliData[97] = 1323
 757    NongliData[98] = 2707
 758    NongliData[99] = 265877
 759    
 760    curYear = Year(ad_date)
 761    curMonth = Month(ad_date)
 762    curDay = Day(ad_date)
 763    GongliStr = string(curYear)+ "年"
 764    If (curMonth &lt; 10) Then
 765        GongliStr = GongliStr + "0" +string(curMonth) + "月"
 766    Else
 767        GongliStr = GongliStr +string(curMonth)+"月"
 768    End If
 769    If (curDay &lt; 10) Then
 770        GongliStr = GongliStr+ "0" +string(curDay)+"日"
 771    Else
 772        GongliStr = GongliStr+string(curDay)+"日"
 773    End If
 774    //生成当前公历星期 ==&gt; WeekdayStr
 775    curWeekday = daynumber(ad_date)
 776    WeekdayStr = weekName[curWeekday]
 777    //计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)
 778    TheDate = (curYear - 1921) * 365 + Int((curYear - 1921) / 4) + curDay + MonthAdd[curMonth - 1] - 38
 779    If (mod(CurYear,4) = 0 And curMonth &gt; 2) Then
 780        TheDate = TheDate+1
 781    End If
 782    //计算农历天干、地支、月、日
 783    isEnd = 0
 784    m = 0
 785    Do
 786        If (NongliData[m] &lt; 4095) Then
 787            k = 11
 788        Else
 789            k = 12
 790        End If
 791        n = k
 792        Do
 793            If (n &lt; 0) Then
 794                Exit 
 795            End If
 796       //获取NongliData(m)的第n个二进制位的值
 797        bit = NongliData[m]
 798        For i = 1 To n Step 1
 799            bit = Int(bit / 2)
 800        Next
 801        bit = mod(bit,2)
 802        If (TheDate &lt;= 29 + bit) Then
 803            isEnd = 1
 804            Exit
 805        End If
 806        TheDate = TheDate - 29 - bit
 807        n = n - 1
 808    loop until 1&lt;&gt;1
 809      If (isEnd = 1) Then
 810          Exit 
 811      End If 
 812      m = m + 1
 813    Loop until 1&lt;&gt;1
 814    curYear = 1921 + m
 815    curMonth = k - n + 1
 816    curDay = TheDate
 817    
 818    If (k = 12) Then
 819        If (curMonth = (Int(NongliData[m] / 65536) + 1)) Then
 820            curMonth = 1 - curMonth
 821        ElseIf (curMonth &gt; (Int(NongliData[m] / 65536) + 1)) Then
 822            curMonth = curMonth - 1
 823        End If
 824    
 825    End If
 826    
 827    //生成农历天干、地支、属相 ==&gt; NongliStr
 828    NongliStr = "农历" + TianGan[mod(mod(curYear - 4,60),10)] + DiZhi[mod(mod(curYear - 4, 60),12)] + "年"
 829    NongliStr = NongliStr +"(" + ShuXiang[mod(mod(curYear - 4,60),12)] + ")"
 830    
 831    //生成农历月、日 ==&gt; NongliDayStr
 832    If (curMonth &lt; 1) Then
 833        NongliDayStr = "闰" + MonName[-1 * curMonth]
 834    Else
 835        NongliDayStr = MonName[curMonth]
 836    End If
 837    NongliDayStr = NongliDayStr + "月"
 838    NongliDayStr = NongliDayStr+DayName[curDay]
 839    return nonglistr+nonglidaystr
 840    
 841    
 842    
 843    
 844    
 845    
 846    end function
 847    public function datetime of_relativedatetime (datetime ad_datetime, long al_number, string as_kind);//*******************************************************************************\\
 848    //函数名:f_RelativeDataTime(datatime ad_datetime, long al_number, string al_kind)
 849    //用  途:计算datatime类型的相对日期时间
 850    //输  入:日期时间、相对数量、单位(天、小时、分、秒)
 851    //输  出:推算后的日期时间
 852    //*******************************************************************************\\
 853    long ll_relativesecond,ll_second
 854    time lt_time
 855    date ld_date
 856    constant long ONEDAYSECOND = 86400 
 857    ld_date = date(ad_datetime)
 858    lt_time = time(ad_datetime)
 859    choose case as_kind
 860    	case "天"
 861    		return datetime(relativedate(ld_date,al_number),lt_time)
 862    	case "小时"
 863    		ll_relativesecond = al_number * 3600
 864    	case "分"
 865    		ll_relativesecond = al_number * 60
 866    	case "秒"
 867    		ll_relativesecond = al_number
 868    end choose
 869    ll_second = hour(lt_time) * 3600 + minute(lt_time) * 60 + second(lt_time)
 870    ld_date = relativedate(ld_date,integer(ll_relativesecond/ONEDAYSECOND))
 871    ll_relativesecond -= integer(ll_relativesecond/ONEDAYSECOND) * ONEDAYSECOND
 872    if (ll_second + ll_relativesecond &lt; 0) then
 873    	return datetime(relativedate(ld_date,-1),relativetime(time("00:00:00:000"),ONEDAYSECOND + ll_second + ll_relativesecond))
 874    end if
 875    if (ll_second + ll_relativesecond &gt; ONEDAYSECOND) then
 876    	return datetime(relativedate(ld_date,1),relativetime(time("00:00:00:000"),ll_second + ll_relativesecond - ONEDAYSECOND))
 877    end if	
 878    return datetime(ld_date,relativetime(lt_time,ll_relativesecond))
 879    end function
 880    
 881    public function string of_gettgdz (integer ai_year);/*函数功能:获取指定年份的天干地支
 882      返回值:string 返回指定的年份的天干地支
 883      参数:ai_year integer 年份*/
 884     string ls_return
 885     setnull(ls_return)
 886     if ai_year &lt;1924 then  return ls_return	
 887     ls_return=mid(fill('甲乙丙丁戊己庚辛壬癸',40),(mod(ai_year -1924,10)+11)*2 -1,2)+mid(fill('子丑寅卯辰巳午未申酉戌亥',48),(mod(ai_year -1924,12)+13)*2 -1,2)
 888     return ls_return
 889    
 890    end function
 891    
 892    public function string of_gettgdz (date ad_date);/*函数功能:获取指定日期所在年份的天干地支
 893      返回值:string 返回指定日期所在年份的天干地支
 894      参数:ad_date date 年份*/
 895     integer al_year
 896     string ls_return
 897     setnull(ls_return)
 898     al_year=year(ad_date)
 899     if al_year &lt;1924 then  return ls_return	
 900     ls_return=mid(fill('甲乙丙丁戊己庚辛壬癸',40),(mod(al_year -1924,10)+11)*2 -1,2)+mid(fill('子丑寅卯辰巳午未申酉戌亥',48),(mod(al_year -1924,12)+13)*2 -1,2)
 901     return ls_return
 902    
 903    end function
 904    
 905    public function string of_gettgdz ();/*函数功能:获取当前日期所在年份的天干地支
 906      返回值:string 返回当前日期所在年份的天干地支*/
 907     integer al_year
 908     string ls_return
 909     setnull(ls_return)
 910     al_year=year(today())
 911     if al_year &lt;1924 then  return ls_return	
 912     ls_return=mid(fill('甲乙丙丁戊己庚辛壬癸',40),(mod(al_year -1924,10)+11)*2 -1,2)+mid(fill('子丑寅卯辰巳午未申酉戌亥',48),(mod(al_year -1924,12)+13)*2 -1,2)
 913     return ls_return
 914    
 915    end function
 916    
 917    public function boolean of_isleapyear ();/*函数功能:获取当前日期所在年份是否为闰年
 918      返回值:boolean  当前日期所在年份是否为闰年,true为是闰年,false为平年*/
 919    integer li_year
 920    li_year=year(today())
 921    return abs(sign(mod(sign(mod(abs(li_year),4))+sign(mod(abs(li_year),100))+sign(mod(abs(li_year),400)),2)) -1)=1
 922    
 923    end function
 924    
 925    public function string of_getgenus (date ad_date);/*函数功能:获取指定日期所在年份的生肖
 926      返回值:string 返回指定日期所在年份的生肖
 927      参数:ad_date date 日期*/
 928    integer li_year
 929    string ls_return
 930    li_year=year(ad_date)
 931    setnull(ls_return)
 932    if li_year &lt;1900 then  return ls_return	
 933    ls_return=mid(fill('鼠牛虎兔龙蛇马羊猴鸡狗猪',48),(mod(li_year -1900,12)+13)*2 -1,2)
 934    return ls_return
 935    end function
 936    
 937    public function string of_getgenus ();/*函数功能:获取当前日期所在年份的生肖
 938      返回值:string 返回当前日期所在年份的生肖  */
 939    integer li_year
 940    string ls_return
 941    li_year=year(today())
 942    setnull(ls_return)
 943    if li_year &lt;1900 then  return ls_return	
 944    ls_return=mid(fill('鼠牛虎兔龙蛇马羊猴鸡狗猪',48),(mod(li_year -1900,12)+13)*2 -1,2)
 945    return ls_return
 946    end function
 947    
 948    public function integer of_countdowinmonth ();/*函数功能:获取当前日期所在月份的星期一的天数
 949      返回值:integer 当前日期所在月份的星期一的天数 */
 950     return of_countdowinmonth(today(),2)
 951    
 952    
 953    
 954    end function
 955    
 956    public function integer of_getage (date ad_brithday);/*函数作用:获取指定生日到当前日期的年纪
 957      函数返回值:integer 指定生日到当前日期的年纪
 958      参数:date ad_brithday 出生日期*/
 959    integer li_age
 960    date ld_date
 961    date ld_temp
 962    ld_date=today()
 963    if ad_brithday&gt;ld_date then
 964    	ld_temp=ad_brithday
 965    	ad_brithday=ld_date
 966    	ld_date=ld_temp
 967    end if
 968    li_age=of_yearsafter(ad_brithday,ld_date)
 969    if ld_date<date(year(ld_date),month(ad_brithday),day(ad_brithday)) (integer="" *函数功能:获取当前日期所在月份的指定星期几的天数="" -="" 1="" 1代表星期天......7代表星期六*="" ai_dow="" ai_dow);="" d_first="" date="" end="" function="" if="" if(ai_dow<1="" intcount,intmonth="" integer="" li_age="" of_countdowinmonth="" or="" public="" return="" then="" 参数:="" 指定当前所在月份的指定星期几的天数="" 指定的星期几="" 返回值:integer="">7) then
 970       ai_dow=daynumber(today())
 971    end if
 972    intmonth=month(today())
 973    d_first=date(year(today()),month(today()),1)
 974    do while daynumber(d_first)&lt;&gt;ai_dow
 975    	d_first=relativedate(d_first,1)
 976    loop
 977    intcount=0
 978    do while month(d_first)=intmonth
 979    	intcount=intcount+1
 980    	d_first=relativedate(d_first,7)
 981    loop
 982    return intcount
 983    
 984    
 985    end function
 986    
 987    public function long of_countweeksinyear ();/*函数用途:获取当前日期所在年份的星期数
 988    返回值:long 返回当前日期所在年份的星期数*/
 989    date		ld_first_ofyear
 990    integer	li_weeknumber
 991    integer	li_leftover_days
 992    ld_first_ofyear = Date(Year(today()), 1, 1)
 993    li_weeknumber = of_WeeksAfter (ld_first_ofyear, today()) + 1 
 994    li_leftover_days = Mod(DaysAfter (ld_first_ofyear, today()), 7)
 995    If (of_getdayinweek(ld_first_ofyear) + li_leftover_days) &gt;= 8 then
 996    	li_weeknumber ++
 997    End If
 998    Return li_weeknumber
 999    end function
1000    
1001    public function boolean of_setsystemtime (datetime adt_datetime);stc_systemtime lstc_systemtime
1002    date ld_date
1003    time lt_time
1004    ld_date=date(adt_datetime)
1005    lt_time=time(adt_datetime)
1006    lstc_systemtime.wyear=year(ld_date)
1007    lstc_systemtime.wmonth=month(ld_date)
1008    lstc_systemtime.wday=day(ld_date)
1009    lstc_systemtime.wdayofweek=daynumber(ld_date)
1010    lstc_systemtime.whour=hour(lt_time)
1011    lstc_systemtime.wminute=minute(lt_time)
1012    lstc_systemtime.wsecond=minute(lt_time)
1013    lstc_systemtime.wmilliseconds=0
1014    return setsystemtime(lstc_systemtime)&lt;&gt;0
1015    
1016    end function
1017    
1018    on nvo_datetime.create
1019    call super::create
1020    TriggerEvent( this, "constructor" )
1021    end on
1022    
1023    on nvo_datetime.destroy
1024    TriggerEvent( this, "destructor" )
1025    call super::destroy
1026    end on
1027    
1028    event constructor;//**********************************************************//
1029    //nvo_datetime 日期时间操作类 ,自创建不可视用户对象         //
1030    //author:tiantianpb                                         //
1031    //write date:2003-11-16                                     //
1032    //used:对各种常用的日期时间操作进行了相关的封装             //
1033    //********************************************************* //
1034    
1035    end event</date(year(ld_date),month(ad_brithday),day(ad_brithday))></date(year(ad_date),month(ad_brithday),day(ad_brithday))></ad_startdate></ad_startdate></ad_startdate>
Published At
Categories with 数据库类
comments powered by Disqus