数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
一个自己封装的日期时间操作的用户对象

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

$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<ad_startdate then
	d_temp=ad_startdate
	ad_enddate=ad_startdate
	ad_startdate=d_temp
end if
ad_startdate=of_skipholidays(adw_holidays,as_columnname,ad_startdate,1)
ad_enddate=of_skipholidays(adw_holidays,as_columnname,ad_enddate,-1)
if ad_startdate>ad_enddate then
	li_return=0
else
	intdays=DaysAfter (ad_startdate, ad_enddate )+1
	intsubstract=intsubstract+of_countholidays(adw_holidays,as_columnname,ad_startdate,ad_enddate)
end if
li_return=intdays - intsubstract
return li_return
end function

public function date of_getfirstdayinweek (date ad_date);/*函数功能:获取指定日期所在周的第一天
  返回值:date  返回指定日期所在周的第一天
  参数:ad_date date 日期 */
date ld_return
ld_return=RelativeDate (ad_date, 1 - daynumber(ad_date))
return ld_return
end function

public function date of_getlastdayinweek (date ad_date);/*函数功能:获取指定日期所在周的最后一天
  返回值:date  返回指定日期所在周的最后一天
  参数:ad_date date 日期 */
date ld_return
ld_return=RelativeDate (ad_date, 7 - daynumber(ad_date))
return ld_return
end function

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

public function date of_getlastdayinmonth ();/*函数功能:获取当前日期所在月份的最后一天
  返回值:date 当前日期所在月份的最后一天*/
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))))
end function

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

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

public function date of_getfirstdayinweek ();/*函数功能:获取当前日期所在周的第一天
  返回值:date  返回当前日期所在周的第一天
  参数:ad_date date 日期 */
date ld_return
ld_return=RelativeDate (today(), 1 - daynumber(today()))
return ld_return
end function

public function date of_getlastdayinweek ();/*函数功能:获取指定日期所在周的最后一天
  返回值:date  返回指定日期所在周的最后一天*/
date ld_return
ld_return=RelativeDate (today(), 7 - daynumber(today()))
return ld_return
end function

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

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

public function integer of_countholidays (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 li_return
date ld_date
ld_date=ad_startdate
do while ld_date<=ad_enddate
	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
		li_return++	
	end if
	ld_date=relativedate(ld_date,1)	
loop	
return li_return
end function

public function integer of_countholidays (date ad_startdate, date ad_enddate);/*函数功能:获取指定日期之间的节假日天数
  返回值:节假日天数
  参数:ad_startdate date 开始日期
		  ad_enddate date 结束日期 */		 
integer li_return
date ld_date
ld_date=ad_startdate
do while ld_date<=ad_enddate
	if of_lsweekend(ld_date)=true then
		li_return++	
	end if
	ld_date=relativedate(ld_date,1)	
loop	
return li_return
end function

public function integer of_countholidays (datastore ads_holidays, string as_columnname, date ad_startdate, date ad_enddate);/*函数功能:获取指定日期之间的节假日天数
  返回值:节假日天数
  参数:ads_holidays datastore存储指定节假日的数据存储对象
        as_columnname string 数据窗口中存储节假日的列名
        ad_startdate date 开始日期
		  ad_enddate date 结束日期 */		 
integer li_return
date ld_date
ld_date=ad_startdate
do while ld_date<=ad_enddate
	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
		li_return++	
	end if
	ld_date=relativedate(ld_date,1)	
loop	
return li_return
end function

public function integer of_countworkdays (datastore ads_holidays, string as_columnname, date ad_startdate, date ad_enddate);/*函数功能:获取指定日期之间的工作日天数
  返回值:工作日天数
  参数:ads_holidays datastroe存储指定节假日的数据存储对象
        as_columnname string 数据窗口中存储节假日的列名
        ad_startdate date 开始日期
		  ad_enddate date 结束日期 */		
integer intdays,li_return
date d_temp
integer intsubstract
if ad_enddate<ad_startdate then
	d_temp=ad_startdate
	ad_enddate=ad_startdate
	ad_startdate=d_temp
end if
ad_startdate=of_skipholidays(ads_holidays,as_columnname,ad_startdate,1)
ad_enddate=of_skipholidays(ads_holidays,as_columnname,ad_enddate,-1)
if ad_startdate>ad_enddate then
	li_return=0
else
	intdays=DaysAfter (ad_startdate, ad_enddate )+1
	intsubstract=intsubstract+of_countholidays(ads_holidays,as_columnname,ad_startdate,ad_enddate)
end if
li_return=intdays - intsubstract
return li_return
end function

public function integer of_countworkdays (date ad_startdate, date ad_enddate);/*函数功能:获取指定日期之间的工作日天数
  返回值:工作日天数
  参数:ad_startdate date 开始日期
		  ad_enddate date 结束日期 */		
integer intdays,li_return
date d_temp
integer intsubstract
if ad_enddate<ad_startdate then
	d_temp=ad_startdate
	ad_enddate=ad_startdate
	ad_startdate=d_temp
end if
ad_startdate=of_skipholidays(ad_startdate,1)
ad_enddate=of_skipholidays(ad_enddate,-1)
if ad_startdate>ad_enddate then
	li_return=0
else
	intdays=DaysAfter (ad_startdate, ad_enddate )+1
	intsubstract=intsubstract+of_countholidays(ad_startdate,ad_enddate)
end if
li_return=intdays - intsubstract
return li_return
end function

public function integer of_getage (date ad_brithday, date ad_date);/*函数作用:获取指定生日到指定日期的年纪
  函数返回值:integer 指定生日到指定日期的年纪
  参数:date ad_brithday 出生日期
       date ad_date 指定日期*/
integer li_age
date ld_temp
if ad_brithday>ad_date then
	ld_temp=ad_brithday
	ad_brithday=ad_date
	ad_date=ld_temp
end if
li_age=of_yearsafter(ad_brithday,ad_date)
if ad_date<date(year(ad_date),month(ad_brithday),day(ad_brithday)) then
	li_age=li_age - 1
end if
return li_age

end function

public function long of_yearsafter (date ad_start, date ad_end);/*函数用途:获取指定日期之间的相差年度
 返回值:long 相差年度
 参数:date ad_start 开始日期
      date ad_end 结束日期*/		
date ld_temp
int li_year, li_mult
double adb_start, adb_end
If IsNull(ad_start) or IsNull(ad_end) Then
	long ll_null
	SetNull (ll_null)
	Return ll_null
End If
If ad_start > ad_end Then
	ld_temp = ad_start
	ad_start = ad_end
	ad_end = ld_temp
	li_mult = -1
else
	li_mult = 1
End If
li_year = year(ad_end) - year(ad_start)
adb_start = month(ad_start)
adb_start = adb_start + day(ad_start) / 100
adb_end = month(ad_end)
adb_end = adb_end + day(ad_end) / 100
If adb_start > adb_end Then
	li_year --
End If
Return li_year * li_mult

end function

public function long of_monthsafter (date ad_start, date ad_end);/* 描述: 两个日期之间的月份间隔
返回:	两个日期之间的月份间隔
参数:date 	ad_start 开始日期
	  date 	ad_end	结束日期  */   
date 		ld_temp
integer 	li_month
integer	li_mult

If IsNull(ad_start) or IsNull(ad_end) Then
	long ll_null
	SetNull(ll_null)
	Return ll_null
End If
If ad_start > ad_end Then
	ld_temp = ad_start
	ad_start = ad_end
	ad_end = ld_temp
	li_mult = -1
else
	li_mult = 1
End If
li_month = (year(ad_end) - year(ad_start) ) * 12
li_month = li_month + month(ad_end) - month(ad_start)

If day(ad_start) > day(ad_end) Then 
	li_month --
End If
Return li_month * li_mult
end function

public function long of_weeksafter (date ad_start, date ad_end);/*函数用途:获取指定日期之间的相差星期数
 返回值:long 相差星期数
 参数:date ad_start 开始日期
      date ad_end 结束日期*/	
If IsNull(ad_start) or IsNull(ad_end) Then
	long ll_null
	SetNull(ll_null)
	Return ll_null
End If
Return Daysafter(ad_start,ad_end) /7
end function

public function long of_secondsafter (datetime adtm_start, datetime adtm_end);/*函数用途:获取指定日期之间的相差分钟数
 返回值:long 相差分钟数
 参数:datetime adtm_start 开始时间
      datetime adtm_end 结束时间*/		
long ll_total_seconds, ll_day_adjust
date ld_sdate, ld_edate
time lt_stime, lt_etime
If IsNull(adtm_start) or IsNull(adtm_end) Then
	long ll_null
	SetNull(ll_null)
	Return ll_null
End If
ld_sdate = date(adtm_start)
ld_edate = date(adtm_end)
lt_stime = time(adtm_start)
lt_etime = time(adtm_end)
If ld_sdate = ld_edate then 
	ll_total_seconds = secondsafter(	lt_stime,lt_etime)
Elseif ld_sdate < ld_edate Then
	ll_total_seconds = SecondsAfter(lt_stime,Time('23:59:59'))
	ll_day_adjust = DaysAfter(ld_sdate,ld_edate) -1
	If ll_day_adjust > 0 Then ll_total_seconds = ll_total_seconds + 86400 * ll_day_adjust
	ll_total_seconds = ll_total_seconds + SecondsAfter(Time('00:00:00'),lt_etime) +1
Else 
	ll_total_seconds = SecondsAfter(lt_stime,Time('00:00:00'))
	ll_day_adjust = DaysAfter(ld_sdate,ld_edate) +1
	If ll_day_adjust < 0 Then ll_total_seconds = ll_total_seconds + 86400 * ll_day_adjust
	ll_total_seconds = ll_total_seconds + SecondsAfter(Time('23:59:59'),lt_etime) -1
end If

return ll_total_seconds

end function

public function long of_millisecsafter (time atm_start, time atm_end);/*函数用途:获取指定时间之间的相差秒数
 返回值:long 相差相差秒数
 参数:time atm_start 开始时间
      time atm_end 结束时间*/	
Long ll_start, ll_end
Long ll_temp
If IsNull(atm_start) or IsNull(atm_end) Then
	long ll_null
	SetNull(ll_null)
	Return ll_null
End If
ll_start = Long (String (atm_start,"fff"))
ll_temp = Second(atm_start) * 1000
ll_start = ll_start + ll_temp
ll_temp = Minute(atm_start) * 60000
ll_start = ll_start + ll_temp
ll_temp = hour(atm_start) *  3600000
ll_start = ll_start + ll_temp
ll_end = Long (String (atm_end,"fff"))
ll_temp = Second(atm_end) * 1000
ll_end = ll_end + ll_temp
ll_temp = minute(atm_end) * 60000
ll_end = ll_end + ll_temp
ll_temp = hour(atm_end) * 3600000
ll_end = ll_end + ll_temp
return ll_end - ll_start
end function

public function date of_relativemonth (date ad_source, integer al_month);/*函数功能:返回指定日期相差指定月份后的日期
返回值:date 指定日期相差指定月份后的日期
参数:date ad_source 初始日期
     integer al_month 月数*/
integer li_adjust_months, li_adjust_years
integer li_month, li_year, li_day
integer li_temp_month
If IsNull(ad_source) or IsNull(al_month) Then
	date ldt_null
	SetNull(ldt_null)
	Return ldt_null
End If
li_adjust_months = mod(al_month, 12)
li_adjust_years = (al_month / 12)
li_temp_month = Month(ad_source) + li_adjust_months
If li_temp_month > 12 Then	
	li_month = li_temp_month - 12
	li_adjust_years ++
ElseIf li_temp_month <= 0 Then	
	li_month = li_temp_month + 12
	li_adjust_years --
Else
	li_month = li_temp_month
End If
li_year = Year(ad_source) + li_adjust_years
li_day = Day(ad_source)
Do While li_day > 0
	li_day --
Loop
Date		ld_Ret 
ld_Ret = Date(li_year, li_month, li_day) 
Return  ld_Ret
end function

public function datetime of_relativedatetime (datetime adtm_start, integer al_offset);/*函数功能:返回指定时间相差指定秒数后的时间
返回值:datetime 指定时间相差指定秒数后的时间
参数:datetime adtm_start 初始时间
     integer al_month 秒数*/
datetime ldt_null
date ld_sdate
time lt_stime
long ll_date_adjust
long ll_time_adjust, ll_time_test
If IsNull(adtm_start) or IsNull(al_offset) Then
	SetNull(ldt_null)
	Return ldt_null
End If
ld_sdate = date(adtm_start)
lt_stime = time(adtm_start)
ll_date_adjust = al_offset /  86400
ll_time_adjust = mod(al_offset, 86400)
ld_sdate = RelativeDate(ld_sdate, ll_date_adjust)
If ll_time_adjust > 0 then
	ll_time_test = SecondsAfter(lt_stime,time('23:59:59'))
	If ll_time_test < ll_time_adjust Then
		ld_sdate = RelativeDate(ld_sdate,1)
		ll_time_adjust = ll_time_adjust - ll_time_test -1
		lt_stime = time('00:00:00')
	End If
	lt_stime = RelativeTime(lt_stime, ll_time_adjust)
ElseIf  ll_time_adjust < 0 then
	ll_time_test = SecondsAfter(lt_stime,time('00:00:00'))
	If   ll_time_test > ll_time_adjust Then
		ld_sdate = RelativeDate(ld_sdate,-1)
		ll_time_adjust = ll_time_adjust - ll_time_test +1
		lt_stime = time('23:59:59')
	End If
	lt_stime = RelativeTime(lt_stime, ll_time_adjust)
End If
return(datetime(ld_sdate,lt_stime))
end function

public function integer of_getquarter (date ad_source);/*函数功能:获得指定日期所在的季度
返回值:integer 指定日期所在的季度
参数:date ad_source日期*/
IF IsNull(ad_source) THEN
	Long ll_null
	SetNull(ll_null)
	Return ll_null
END IF
Integer li_Month , li_Quarter
li_Month = Month(ad_Source)
li_Quarter = (li_Month -1)/3
Return li_Quarter

end function

public function integer of_getquarter ();/*函数功能:获得当前日期所在的季度
返回值:integer 当前日期所在的季度*/
Integer li_Month , li_Quarter
li_Month = Month(today())
li_Quarter = (li_Month -1)/3
Return li_Quarter

end function

public function date of_getfirstdayinquarter (date ad_date);/*函数用途:获取指定日期所在的季度的第一天
返回值:date 指定日期所在的季度的第一天
参数:date ad_date 指定日期*/
date ld_return
constant integer li_monthsinquarter=3
ld_return=date(year(ad_date),int((month(ad_date) - 1)/li_monthsinquarter)*li_monthsinquarter+1,1)
return ld_return
end function

public function date of_getfirstdayinquarter ();/*函数用途:获取当前日期所在的季度的第一天
返回值:date 当前日期所在的季度的第一天*/
date ld_return
constant integer li_monthsinquarter=3
ld_return=date(year(today()),int((month(today()) - 1)/li_monthsinquarter)*li_monthsinquarter+1,1)
return ld_return
end function

public function date of_getlastdayinquarter (date ad_date);/*函数用途:获取指定日期所在的季度的最后一天
返回值:date 指定日期所在的季度的最后一天
参数:date ad_date 指定日期*/
date ld_return
constant integer li_monthsinquarter=3
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))))
return ld_return
end function

public function date of_getlastdayinquarter ();/*函数用途:获取当前日期所在的季度的最后一天
返回值:date 当前日期所在的季度的最后一天*/
date ld_return
constant integer li_monthsinquarter=3
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))))
return ld_return
end function

public function long of_countweeksinyear (date ad_source);/*函数用途:获取指定日期所在年份的星期数
返回值:long 返回日期所在年份的星期数
参数:date ad_source 指定日期*/
date		ld_first_ofyear
integer	li_weeknumber
integer	li_leftover_days
If IsNull(ad_source) Then
	long ll_null
	SetNull(ll_null)
	Return ll_null
End If
ld_first_ofyear = Date(Year(ad_source), 1, 1)
li_weeknumber = of_WeeksAfter (ld_first_ofyear, ad_source) + 1 
li_leftover_days = Mod(DaysAfter (ld_first_ofyear, ad_source), 7)
If (of_getdayinweek(ld_first_ofyear) + li_leftover_days) >= 8 then
	li_weeknumber ++
End If
Return li_weeknumber
end function

public function integer of_getdayinweek (date ad_source);// 描述: 决定日期是星期几,以星期天作为一个星期的第一天
// 参数:	
//		[value] 	date 	ad_source		<描述>
// 返回:	(INTEGER) 
//						1 - If the Day is Sunday.
//						2 - If the Day is Monday
//						3 - If the Day is Tuesday.
//						4 - If the Day is Wednesday.
//						5 - If the Day is Thursday.
//						6 - If the Day is Friday.
//						7 - If the Day is Saturday.
//						If any argument's value is NULL, function returns NULL.
//
If IsNull(ad_source) Then
	long ll_null
	SetNull(ll_null)
	Return ll_null
End If
return DayNumber (ad_source)

end function

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

public function date of_getfirstdayinyear ();/*函数功能:获取当前日期所在年份的第一天
  返回值:date 当前日期所在年份的第一天
  参数:date  ad_date  日期  */
return date(year(today()),1,1)
end function

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

public function date of_getlastdayinyear (date ad_date);/*函数功能:获取指定日期所在年份的最后一天
  返回值:date 指定日期所在年份的最后一天
  参数:date  ad_date  日期  */
return date(year(ad_date),12,31)
end function

public function date of_getlastdayinyear ();/*函数功能:获取当前日期所在年份的最后一天
  返回值:date 当前日期所在年份的最后一天
  参数:date  ad_date  日期  */
return date(year(today()),12,31)
end function

public function date of_getlastdayinyear (integer ai_year);/*函数功能:获取指定日期所在年份的最后一天
  返回值:date 指定日期所在年份的最后一天
  参数:integer  ai_year  年份  */
return date(ai_year,12,31)
end function

public function integer of_countyeardays (date ad_date);/*函数用途:获取指定日期所在年份的天数
函数返回值:integer 天数
参数:date ad_date 日期*/
return daysafter(of_getfirstdayinyear(ad_date),of_getlastdayinyear(ad_date))
end function

public function integer of_countyeardays ();/*函数用途:获取当前日期所在年份的天数
函数返回值:integer 天数*/
return daysafter(of_getfirstdayinyear(),of_getlastdayinyear())
end function

public function integer of_countyeardays (integer ai_year);/*函数用途:获取指定年份的天数
函数返回值:integer 天数
参数:integer ai_year 年份*/
return daysafter(of_getfirstdayinyear(ai_year),of_getlastdayinyear(ai_year))
end function

public function string of_getconstellation (date ad_date);/*函数用途:返回指定日期所在星座
返回值:string 指定日期所在星座
参数:date ad_date 指定日期*/
return mid("摩羯水瓶双鱼白羊金牛双子巨蟹狮子处女天秤天蝎射手摩羯",(month(ad_date)+sign(sign(day(ad_date) -(19+integer(mid('102123444423',month(ad_date),1))))+1))*4 -3,4)+'座'
end function

public function string of_getgenus (integer ai_year);/*函数功能:获取指定年份的生肖
  返回值:string 返回指定的年份的生肖
  参数:ai_year integer 年份*/
string ls_return
setnull(ls_return)
if ai_year <1900 then  return ls_return	
ls_return=mid(fill('鼠牛虎兔龙蛇马羊猴鸡狗猪',48),(mod(ai_year -1900,12)+13)*2 -1,2)
return ls_return
end function

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]
long MonthAdd[0 to 11],NongliData[0 to 99]
long  curTime, curYear, curMonth, curDay, curWeekday
string GongliStr, WeekdayStr, NongliStr, NongliDayStr
long i, m, n, k, isEnd, bit,thedate
WeekName[0] = " * "
WeekName[1] = "星期日"
WeekName[2] = "星期一"
WeekName[3] = "星期二"
WeekName[4] = "星期三"
WeekName[5] = "星期四"
WeekName[6] = "星期五"
WeekName[7] = "星期六"

//天干名称
TianGan[0] = "甲"
TianGan[1] = "乙"
TianGan[2] = "丙"
TianGan[3] = "丁"
TianGan[4] = "戊"
TianGan[5] = "己"
TianGan[6] = "庚"
TianGan[7] = "辛"
TianGan[8] = "壬"
TianGan[9] = "癸"

//地支名称
DiZhi[0] = "子"
DiZhi[1] = "丑"
DiZhi[2] = "寅"
DiZhi[3] = "卯"
DiZhi[4] = "辰"
DiZhi[5] = "巳"
DiZhi[6] = "午"
DiZhi[7] = "未"
DiZhi[8] = "申"
DiZhi[9] = "酉"
DiZhi[10] = "戌"
DiZhi[11] = "亥"

//属相名称
ShuXiang[0] = "鼠"
ShuXiang[1] = "牛"
ShuXiang[2] = "虎"
ShuXiang[3] = "兔"
ShuXiang[4] = "龙"
ShuXiang[5] = "蛇"
ShuXiang[6] = "马"
ShuXiang[7] = "羊"
ShuXiang[8] = "猴"
ShuXiang[9] = "鸡"
ShuXiang[10] = "狗"
ShuXiang[11] = "猪"

//农历日期名
DayName[0] = "*"
DayName[1] = "初一"
DayName[2] = "初二"
DayName[3] = "初三"
DayName[4] = "初四"
DayName[5] = "初五"
DayName[6] = "初六"
DayName[7] = "初七"
DayName[8] = "初八"
DayName[9] = "初九"
DayName[10] = "初十"
DayName[11] = "十一"
DayName[12] = "十二"
DayName[13] = "十三"
DayName[14] = "十四"
DayName[15] = "十五"
DayName[16] = "十六"
DayName[17] = "十七"
DayName[18] = "十八"
DayName[19] = "十九"
DayName[20] = "二十"
DayName[21] = "廿一"
DayName[22] = "廿二"
DayName[23] = "廿三"
DayName[24] = "廿四"
DayName[25] = "廿五"
DayName[26] = "廿六"
DayName[27] = "廿七"
DayName[28] = "廿八"
DayName[29] = "廿九"
DayName[30] = "三十"

//农历月份名
MonName[0] = "*"
MonName[1] = "正"
MonName[2] = "二"
MonName[3] = "三"
MonName[4] = "四"
MonName[5] = "五"
MonName[6] = "六"
MonName[7] = "七"
MonName[8] = "八"
MonName[9] = "九"
MonName[10] = "十"
MonName[11] = "十一"
MonName[12] = "腊"

//公历每月前面的天数
MonthAdd[0] = 0
MonthAdd[1] = 31
MonthAdd[2] = 59
MonthAdd[3] = 90
MonthAdd[4] = 120
MonthAdd[5] = 151
MonthAdd[6] = 181
MonthAdd[7] = 212
MonthAdd[8] = 243
MonthAdd[9] = 273
MonthAdd[10] = 304
MonthAdd[11] = 334

//农历数据
NongliData[0] = 2635
NongliData[1] = 333387
NongliData[2] = 1701
NongliData[3] = 1748
NongliData[4] = 267701
NongliData[5] = 694
NongliData[6] = 2391
NongliData[7] = 133423
NongliData[8] = 1175
NongliData[9] = 396438
NongliData[10] = 3402
NongliData[11] = 3749
NongliData[12] = 331177
NongliData[13] = 1453
NongliData[14] = 694
NongliData[15] = 201326
NongliData[16] = 2350
NongliData[17] = 465197
NongliData[18] = 3221
NongliData[19] = 3402
NongliData[20] = 400202
NongliData[21] = 2901
NongliData[22] = 1386
NongliData[23] = 267611
NongliData[24] = 605
NongliData[25] = 2349
NongliData[26] = 137515
NongliData[27] = 2709
NongliData[28] = 464533
NongliData[29] = 1738
NongliData[30] = 2901
NongliData[31] = 330421
NongliData[32] = 1242
NongliData[33] = 2651
NongliData[34] = 199255
NongliData[35] = 1323
NongliData[36] = 529706
NongliData[37] = 3733
NongliData[38] = 1706
NongliData[39] = 398762
NongliData[40] = 2741
NongliData[41] = 1206
NongliData[42] = 267438
NongliData[43] = 2647
NongliData[44] = 1318
NongliData[45] = 204070
NongliData[46] = 3477
NongliData[47] = 461653
NongliData[48] = 1386
NongliData[49] = 2413
NongliData[50] = 330077
NongliData[51] = 1197
NongliData[52] = 2637
NongliData[53] = 268877
NongliData[54] = 3365
NongliData[55] = 531109
NongliData[56] = 2900
NongliData[57] = 2922
NongliData[58] = 398042
NongliData[59] = 2395
NongliData[60] = 1179
NongliData[61] = 267415
NongliData[62] = 2635
NongliData[63] = 661067
NongliData[64] = 1701
NongliData[65] = 1748
NongliData[66] = 398772
NongliData[67] = 2742
NongliData[68] = 2391
NongliData[69] = 330031
NongliData[70] = 1175
NongliData[71] = 1611
NongliData[72] = 200010
NongliData[73] = 3749
NongliData[74] = 527717
NongliData[75] = 1452
NongliData[76] = 2742
NongliData[77] = 332397
NongliData[78] = 2350
NongliData[79] = 3222
NongliData[80] = 268949
NongliData[81] = 3402
NongliData[82] = 3493
NongliData[83] = 133973
NongliData[84] = 1386
NongliData[85] = 464219
NongliData[86] = 605
NongliData[87] = 2349
NongliData[88] = 334123
NongliData[89] = 2709
NongliData[90] = 2890
NongliData[91] = 267946
NongliData[92] = 2773
NongliData[93] = 592565
NongliData[94] = 1210
NongliData[95] = 2651
NongliData[96] = 395863
NongliData[97] = 1323
NongliData[98] = 2707
NongliData[99] = 265877

curYear = Year(ad_date)
curMonth = Month(ad_date)
curDay = Day(ad_date)
GongliStr = string(curYear)+ "年"
If (curMonth < 10) Then
    GongliStr = GongliStr + "0" +string(curMonth) + "月"
Else
    GongliStr = GongliStr +string(curMonth)+"月"
End If
If (curDay < 10) Then
    GongliStr = GongliStr+ "0" +string(curDay)+"日"
Else
    GongliStr = GongliStr+string(curDay)+"日"
End If
//生成当前公历星期 ==> WeekdayStr
curWeekday = daynumber(ad_date)
WeekdayStr = weekName[curWeekday]
//计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)
TheDate = (curYear - 1921) * 365 + Int((curYear - 1921) / 4) + curDay + MonthAdd[curMonth - 1] - 38
If (mod(CurYear,4) = 0 And curMonth > 2) Then
    TheDate = TheDate+1
End If
//计算农历天干、地支、月、日
isEnd = 0
m = 0
Do
    If (NongliData[m] < 4095) Then
        k = 11
    Else
        k = 12
    End If
    n = k
    Do
        If (n < 0) Then
            Exit 
        End If
   //获取NongliData(m)的第n个二进制位的值
    bit = NongliData[m]
    For i = 1 To n Step 1
        bit = Int(bit / 2)
    Next
    bit = mod(bit,2)
    If (TheDate <= 29 + bit) Then
        isEnd = 1
        Exit
    End If
    TheDate = TheDate - 29 - bit
    n = n - 1
loop until 1<>1
  If (isEnd = 1) Then
      Exit 
  End If 
  m = m + 1
Loop until 1<>1
curYear = 1921 + m
curMonth = k - n + 1
curDay = TheDate

If (k = 12) Then
    If (curMonth = (Int(NongliData[m] / 65536) + 1)) Then
        curMonth = 1 - curMonth
    ElseIf (curMonth > (Int(NongliData[m] / 65536) + 1)) Then
        curMonth = curMonth - 1
    End If

End If

//生成农历天干、地支、属相 ==> NongliStr
NongliStr = "农历" + TianGan[mod(mod(curYear - 4,60),10)] + DiZhi[mod(mod(curYear - 4, 60),12)] + "年"
NongliStr = NongliStr +"(" + ShuXiang[mod(mod(curYear - 4,60),12)] + ")"

//生成农历月、日 ==> NongliDayStr
If (curMonth < 1) Then
    NongliDayStr = "闰" + MonName[-1 * curMonth]
Else
    NongliDayStr = MonName[curMonth]
End If
NongliDayStr = NongliDayStr + "月"
NongliDayStr = NongliDayStr+DayName[curDay]
return nonglistr+nonglidaystr






end function
public function datetime of_relativedatetime (datetime ad_datetime, long al_number, string as_kind);//*******************************************************************************\\
//函数名:f_RelativeDataTime(datatime ad_datetime, long al_number, string al_kind)
//用  途:计算datatime类型的相对日期时间
//输  入:日期时间、相对数量、单位(天、小时、分、秒)
//输  出:推算后的日期时间
//*******************************************************************************\\
long ll_relativesecond,ll_second
time lt_time
date ld_date
constant long ONEDAYSECOND = 86400 
ld_date = date(ad_datetime)
lt_time = time(ad_datetime)
choose case as_kind
	case "天"
		return datetime(relativedate(ld_date,al_number),lt_time)
	case "小时"
		ll_relativesecond = al_number * 3600
	case "分"
		ll_relativesecond = al_number * 60
	case "秒"
		ll_relativesecond = al_number
end choose
ll_second = hour(lt_time) * 3600 + minute(lt_time) * 60 + second(lt_time)
ld_date = relativedate(ld_date,integer(ll_relativesecond/ONEDAYSECOND))
ll_relativesecond -= integer(ll_relativesecond/ONEDAYSECOND) * ONEDAYSECOND
if (ll_second + ll_relativesecond < 0) then
	return datetime(relativedate(ld_date,-1),relativetime(time("00:00:00:000"),ONEDAYSECOND + ll_second + ll_relativesecond))
end if
if (ll_second + ll_relativesecond > ONEDAYSECOND) then
	return datetime(relativedate(ld_date,1),relativetime(time("00:00:00:000"),ll_second + ll_relativesecond - ONEDAYSECOND))
end if	
return datetime(ld_date,relativetime(lt_time,ll_relativesecond))
end function

public function string of_gettgdz (integer ai_year);/*函数功能:获取指定年份的天干地支
  返回值:string 返回指定的年份的天干地支
  参数:ai_year integer 年份*/
 string ls_return
 setnull(ls_return)
 if ai_year <1924 then  return ls_return	
 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)
 return ls_return

end function

public function string of_gettgdz (date ad_date);/*函数功能:获取指定日期所在年份的天干地支
  返回值:string 返回指定日期所在年份的天干地支
  参数:ad_date date 年份*/
 integer al_year
 string ls_return
 setnull(ls_return)
 al_year=year(ad_date)
 if al_year <1924 then  return ls_return	
 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)
 return ls_return

end function

public function string of_gettgdz ();/*函数功能:获取当前日期所在年份的天干地支
  返回值:string 返回当前日期所在年份的天干地支*/
 integer al_year
 string ls_return
 setnull(ls_return)
 al_year=year(today())
 if al_year <1924 then  return ls_return	
 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)
 return ls_return

end function

public function boolean of_isleapyear ();/*函数功能:获取当前日期所在年份是否为闰年
  返回值:boolean  当前日期所在年份是否为闰年,true为是闰年,false为平年*/
integer li_year
li_year=year(today())
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 string of_getgenus (date ad_date);/*函数功能:获取指定日期所在年份的生肖
  返回值:string 返回指定日期所在年份的生肖
  参数:ad_date date 日期*/
integer li_year
string ls_return
li_year=year(ad_date)
setnull(ls_return)
if li_year <1900 then  return ls_return	
ls_return=mid(fill('鼠牛虎兔龙蛇马羊猴鸡狗猪',48),(mod(li_year -1900,12)+13)*2 -1,2)
return ls_return
end function

public function string of_getgenus ();/*函数功能:获取当前日期所在年份的生肖
  返回值:string 返回当前日期所在年份的生肖  */
integer li_year
string ls_return
li_year=year(today())
setnull(ls_return)
if li_year <1900 then  return ls_return	
ls_return=mid(fill('鼠牛虎兔龙蛇马羊猴鸡狗猪',48),(mod(li_year -1900,12)+13)*2 -1,2)
return ls_return
end function

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



end function

public function integer of_getage (date ad_brithday);/*函数作用:获取指定生日到当前日期的年纪
  函数返回值:integer 指定生日到当前日期的年纪
  参数:date ad_brithday 出生日期*/
integer li_age
date ld_date
date ld_temp
ld_date=today()
if ad_brithday>ld_date then
	ld_temp=ad_brithday
	ad_brithday=ld_date
	ld_date=ld_temp
end if
li_age=of_yearsafter(ad_brithday,ld_date)
if ld_date<date(year(ld_date),month(ad_brithday),day(ad_brithday)) then
	li_age=li_age - 1
end if
return li_age

end function

public function integer of_countdowinmonth (integer ai_dow);/*函数功能:获取当前日期所在月份的指定星期几的天数
  返回值:integer 指定当前所在月份的指定星期几的天数
  参数:  ai_dow integer 指定的星期几 1代表星期天......7代表星期六*/
date d_first
integer intcount,intmonth
if(ai_dow<1 or ai_dow>7) then
   ai_dow=daynumber(today())
end if
intmonth=month(today())
d_first=date(year(today()),month(today()),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 long of_countweeksinyear ();/*函数用途:获取当前日期所在年份的星期数
返回值:long 返回当前日期所在年份的星期数*/
date		ld_first_ofyear
integer	li_weeknumber
integer	li_leftover_days
ld_first_ofyear = Date(Year(today()), 1, 1)
li_weeknumber = of_WeeksAfter (ld_first_ofyear, today()) + 1 
li_leftover_days = Mod(DaysAfter (ld_first_ofyear, today()), 7)
If (of_getdayinweek(ld_first_ofyear) + li_leftover_days) >= 8 then
	li_weeknumber ++
End If
Return li_weeknumber
end function

public function boolean of_setsystemtime (datetime adt_datetime);stc_systemtime lstc_systemtime
date ld_date
time lt_time
ld_date=date(adt_datetime)
lt_time=time(adt_datetime)
lstc_systemtime.wyear=year(ld_date)
lstc_systemtime.wmonth=month(ld_date)
lstc_systemtime.wday=day(ld_date)
lstc_systemtime.wdayofweek=daynumber(ld_date)
lstc_systemtime.whour=hour(lt_time)
lstc_systemtime.wminute=minute(lt_time)
lstc_systemtime.wsecond=minute(lt_time)
lstc_systemtime.wmilliseconds=0
return setsystemtime(lstc_systemtime)<>0

end function

on nvo_datetime.create
call super::create
TriggerEvent( this, "constructor" )
end on

on nvo_datetime.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on

event constructor;//**********************************************************//
//nvo_datetime 日期时间操作类 ,自创建不可视用户对象         //
//author:tiantianpb                                         //
//write date:2003-11-16                                     //
//used:对各种常用的日期时间操作进行了相关的封装             //
//********************************************************* //

end event




相关文章

相关软件