标题:Decoding the timestamp in class libararies and forms
作者:Calvin_Hsia
时间:Friday, January 21, 2005 11:55 AM
翻译:xinjie
我曾经被问到这样一个问题:
有什么方式可以将类库中的时间戳转换为可阅读的格式?
Visual Foxpro 在表(表单或类库)中的很多记录中放置了一个时间戳。这个字段本来是用于在不同的平台上进行记录的协调:DOS、Mac、Unix、Windows。
VFP 保留了一个变量 “_screen”作为一个表单实例的对象引用,它代表 VFP 的桌面。因为它是一个表单引用,所以你可以使用SaveAsClass 方法将其作为一个类来保存。 这样就会在下面的运行代码中导致产生一个时间戳字段。示例代码延迟3秒,创建一个表单的子类,并增加一个按钮,然后显示出类库中的时间戳字段。
时间戳显示为一个标准格式。
ERASE t.vcx
_screen.AddObject("btn","commandbutton") && 在桌面增加一个按钮
_screen.SaveAsClass("t.vcx","myform") && 创建目标文件 myform 类
INKEY(3) && 延迟3秒
MODIFY CLASS xx OF t.vcx as myform FROM t.vcx nowait && 在同一类库中创建 myform 的子类
ASELOBJ(aArray,1) && 在设计器中得到类的对象引用
aArray[1].addobject("btn2","commandbutton") && 在类中增加 btn2
aArray[1].btn2.top=200 && 移动新增 btn2 使之可见
KEYBOARD "Y" && 在“你想保存更改吗?”中按"y"
RELEASE WINDOWS "Class designer" && 关闭设计器
USE t.vcx && 打开表
SCAN FOR timestamp!=0 && 查找时间戳字段
?timestamp,DecodeTimeStamp(timestamp),objname+" "+class
ENDSCAN
PROCEDURE DecodeTimeStamp(nTimestamp as Number) as Datetime && see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/filetimetodosdatetime.asp
nDate=BITRSHIFT(nTimestamp,16)
nTime=BITAND(nTimestamp,2^16-1)
nYear=BITAND(BITRSHIFT(nDate,9),2^8-1)+1980
nMonth=BITAND(BITRSHIFT(nDate,5),2^4-1)
nDay=BITAND(nDate,2^5-1)
nHr=BITAND(BITRSHIFT(nTime,11),2^5-1)
nMin=BITAND(BITRSHIFT(nTime,5),2^6-1)
nSec=BITAND(nTime,2^5-1)
RETURN DATETIME(nYear,nMonth,nDay,nHr,nMin,nSec)
RETURN