利用自定义函数处理两个时间的差值和均值问题.docx

上传人:b****8 文档编号:23614936 上传时间:2023-05-19 格式:DOCX 页数:8 大小:18.46KB
下载 相关 举报
利用自定义函数处理两个时间的差值和均值问题.docx_第1页
第1页 / 共8页
利用自定义函数处理两个时间的差值和均值问题.docx_第2页
第2页 / 共8页
利用自定义函数处理两个时间的差值和均值问题.docx_第3页
第3页 / 共8页
利用自定义函数处理两个时间的差值和均值问题.docx_第4页
第4页 / 共8页
利用自定义函数处理两个时间的差值和均值问题.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

利用自定义函数处理两个时间的差值和均值问题.docx

《利用自定义函数处理两个时间的差值和均值问题.docx》由会员分享,可在线阅读,更多相关《利用自定义函数处理两个时间的差值和均值问题.docx(8页珍藏版)》请在冰豆网上搜索。

利用自定义函数处理两个时间的差值和均值问题.docx

利用自定义函数处理两个时间的差值和均值问题

利用自定义函数处理两个时间的差值和均值问题

  Abstract:

Thisarticlegivesacomputer-definedfunction,descriptivethedesignmentalityandthesourcecodeofthefunctionprocess,expoundsthismethodsimplicity,versatility,easyoperationalandreliability,andintroduceitsserviceconditionunifiedtheapplicationexample.

  Keywords:

hydrologicaldata;timeinterpolation;timeaverage;function;example

  

  摘要:

本文给出一个计算机自定义函数,叙述了该函数过程的设计思路和源程序代码,阐明了此方法的简单性、通用性、易操作性和可靠性,并结合应用实例介绍了其使用情况。

  关键词:

水文资料时间差值和均值函数举例

  中图分类号:

O174文献标识码:

A文章编号:

  

  1问题的提出

  在工作实践中,经常需要我们对一个时间段进行各类操作,比如计算两个时间的历时即差值,两个时间的中间时间即均值。

如果该差值是很小的,不难由人工直接计算这两项数据,而在计算机进行运算和管理时却变成了一个复杂的过程。

因为,这两个时间往往都是日期-时间型数据,各类软件开发工具均未能直接给出它们的关系运算函数,或只是对日期和时间分别给出简单的运算,实践中遇到的跨日、跨月甚至跨年度的时间段的处理会给我们带来更大难度。

从水文测验过程到水情拍报乃至资料整编,都常常遇到这一问题,给计算机处理带来极大的不便。

为此,笔者经过摸索和反复验证,给出一个成熟可靠的自定义函数,调入计算机内存后便可灵活地对任意两个日期――时间型数据进行操作。

  2自定义函数的设计

  2.1设计思路

  构造该函数过程,按不同的参数返回(Return)两个不同结果,即时间差值和均值。

该函数有5个参数,分别设定为第一时间的日期和时分dat1和tim1、第二时间的日期和时分dat2和tim2,控制函数返回差值或均值参数cs(Integer型),取1或0,于是给出函数型式Op_DateTime(dat1,tim1,dat2,tim2,cs)。

比较出两个日期-时间型数据的较小者,提取其中的年份并以该年份的1月1日00:

00时为参照时间,如此就会最简单地使用系统函数计算出两个时间分别同这一参照时间的差值,换算为分钟,则这两个差值的差即为所求差值。

将该差值除以2,按年月日时规则,通过循环数据结构控制累加到第一时间,即为所求均值。

  2.2函数源代码(PowerScript脚本)

  //函数形式Op_DateTime(dat1,tim1,dat2,tim2,cs)

  //返回值jisuan_date_time为String型

  //dat1、dat2为Date型,tim1、tim2为Time型,cs为Integer型

  //cs=1函数返回差值,否则返回均值

  //下面声明程序使用的变量,考虑分钟等数值过大,尽量使用Long和Decimal型

  Datedat,dat0

  Timetim

  Longtianshu1,tianshu2,ztime,xiaoshi,yue,tian,shi,fen

  Longjisuan_djisuan_m,jisuan_y,i,m_2

  Decfenzhong

  Stringjisuan_date_time=""

  //如果给定的第一时间大于第二时间,则交换一下位置

  IFDateTime(dat1,tim1)>DateTime(dat2,tim2)THEN

  dat=dat1

  dat1=dat2

  dat2=dat

  tim=tim1

  tim1=tim2

  tim2=tim

  ENDIF

  dat0=Date(Year(dat1),1,1)//虚拟第一时间年份的1月1日00:

00时做参照时间

  tianshu1=DaysAfter(dat0,dat1)//取得第一时间同参照时间的之间的天数

  tianshu2=DaysAfter(dat0,dat2)//取得第二时间同参照时间的之间的天数

  //计算两个时间之间总分钟数

  ztime=tianshu2*1440+Hour(tim2)*60+Minute(tim2)

  ztime=ztime-(tianshu1*1440+Hour(tim1)*60+Minute(tim1))

  IFcs=1THEN

  jisuan_date_time=String(Ztime)//得到参数为1时的时间间隔(分钟,String型)

  ELSE//参数不为1时,推算两个时间的中值或叫均值

  jisuan_d=Day(dat1)//得到第一时间中的天数

  jisuan_m=Month(dat1)//得到第一时间中的月份

  jisuan_y=Year(dat1)//得到第一时间中的年度

  fenzhong=Minute(tim1)+Ztime/2

  i=0

  DOUNTILfenzhong<=32766//将分钟变得足够小,以便下边能取Integer

  fenzhong=fenzhong-32766//并要保证分钟整数部分原有的奇和偶

  i=i+1

  LOOP

  IFfenzhong>Int(fenzhong)THEN//考虑逢5奇进偶舍

  IFInt(fenzhong)/2=Int(Int(fenzhong)/2)THEN

  fenzhong=Int(fenzhong)

  ELSE

  fenzhong=Int(fenzhong)+1

  ENDIF

  ENDIF

  fenzhong=fenzhong+32766*i

  fen=Mod(fenzhong,60)//取余数得到平均时间的分钟值

  xiaoshi=Int(fenzhong/60)+Hour(tim1)

  shi=Mod(Dec(xiaoshi),24)//取余数得到平均时间的小时值

  tian=Int(xiaoshi/24)//取整数得到进位的天数

  IFtian>0THEN

  FORi=1TOtian//按不同的月份和年份逐日进位

  CHOOSECASEjisuan_m

  CASE1,3,5,7,8,10,12

  IFjisuan_d<31THEN

  jisuan_d=jisuan_d+1

  ELSE

  jisuan_d=1

  IFjisuan_m=12THEN

  jisuan_m=1

  jisuan_y=jisuan_y+1

  ELSE

  jisuan_m=jisuan_m+1

  ENDIF

  ENDIF

  CASE2

  IFjisuan_y=Int(jisuan_y/4)*4THEN//考虑闰年情况

  m_2=29

  ELSE

  m_2=28

  ENDIF

  IFjisuan_d

  jisuan_d=jisuan_d+1

  ELSE

  jisuan_d=1

  jisuan_m=jisuan_m+1

  ENDIF

  CASEELSE

  IFjisuan_d<30THEN

  jisuan_d=jisuan_d+1

  ELSE

  jisuan_d=1

  jisuan_m=jisuan_m+1

  ENDIF

  ENDCHOOSE

  NEXT

  ENDIF

  //按yyyy-mm-ddhh:

mm格式计算取得平均时间结果,String型

  jisuan_date_time=jisuan_date_time+String(jisuan_y)

  IFjisuan_m<10THEN

  jisuan_date_time=jisuan_date_time+"-0"+String(jisuan_m)

  ELSE

  jisuan_date_time=jisuan_date_time+"-"+String(jisuan_m)

  ENDIF

  IFjisuan_d<10THEN

  jisuan_date_time=jisuan_date_time+"-0"+String(jisuan_d)

  ELSE

  jisuan_date_time=jisuan_date_time+"-"+String(jisuan_d)

  ENDIF

  IFshi<10THEN

  jisuan_date_time=jisuan_date_time+"0"+String(shi)

  ELSE

  jisuan_date_time=jisuan_date_time+""+String(shi)

  ENDIF

  IFfen<10THEN

  jisuan_date_time=jisuan_date_time+":

0"+String(fen)

  ELSE

  jisuan_date_time=jisuan_date_time+":

"+String(fen)

  ENDIF

  ENDIF

  RETURNjisuan_date_time//返回函数值,String型

  3自定义函数的应用

  3.1使用该函数应注意的问题

  从程序代码可以看到,为最大限度满足其通用性,一方面,该函数不论是对几分钟的短时间段,还是对几年的长历时,都能正确返回差值或均值。

另一方面,在使用系统函数时,尽量兼顾各类程序语言。

例如,PowerScript函数库中的Ceiling(n)函数能够返回大于数值型变量n的最小整数,但在这里没有使用,而是使用的取整函数Int(),并对超出Integer型范围的数进行了处理。

在使用该函数时,除考虑不同软件开发语言的差别外,还应注意以下几点:

一是该函数在计算均值时考虑了“四舍六入,逢五奇进偶舍”的原则,如果在实际应用中不需要这种处理,就直接应用系统的“四舍五入”(Round)函数。

二是由于该函数是通过参数控制返回2个可选择而且是不同类型的结果,因此,不论是差值还是均值都已经定义为字符型,那么返回的数据在使用时都须进行数据类型转换。

三是该函数操作和返回的数据均精确到分钟,如果实际需要更精确,可通过增加循环控制来实现。

  3.2在实测流量、输沙量管理系统中的应用实例

  该函数在笔者研制的实测流量、输沙量管理系统中发挥了非常理想的作用,那就是在实测流量、输沙量的计算过程中能获取用户输入的起止2个施测时间,均为日期-时间型,由程序来取得平均施测时间以对应本次瞬时流量和输沙量,并据此点绘流量和输沙量过程线,推算日平均流量和输沙率,为了辅助报汛,还计算出累计过水量和输沙总量。

如表1。

  表130909999_2007-12-28流量(输沙)过程

  

  

  

  实测流量、输沙量成果表同过程线图建立链接后,系统自动插入各日00:

00时和24:

00时的数据,按照连实测流量过程线法推流,可使用该自定义函数在任意两个时间段内插入一个均值时间及相应的流量、输沙量,再按照人为需要和过程线趋势进行手工调整,直到取得满意的过程线后实施相应的计算功能。

该函数在计算各时段的历时过程中,为该程序模块取得了事半功倍的效果。

  4结语

  本文给出的这一函数,从思路到实现的过程都是严密的,全面考虑了各种情况,大量的实际应用更表明了该函数具有简单性、通用性、易操作性和可靠性,而且作为自定义函数,调入计算机内存后同系统函数的运算效果是相同的,在此提供给广大同仁及爱好者。

当然,这只是笔者在水文资料电算中的一点经验之谈,不妥之处,敬请指正。

  

  作者简介:

  张英骏(1967-),男,河北省黄骅市人,高级工程师,主要从事水文水资源管理工作。

  刘国强(1976-),男,河北省沧县人,工程师,主要从事水文资料整编工作。

  赵国辉(1981-),男,河北省唐山人,助理工程师,主要从事水文资料整编工作。

  注:

文章内所有公式及图表请用PDF形式查看。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1