说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Delphi系列的Y2K问题

HTML文档下载 WORD文档下载 PDF文档下载
Delphi系列的Y2K问题

Delphi发展至今,已经是第五版本了。尽管各个版本有大大小小的Bug

但疵不掩暇,她还是赢得了广大程序员和编程爱好者的追随和爱戴。随着2000年的逼近, Y2K的一系列问题和各种解决方案也就随之提到日程上来。对编程者来说,我们现在关心的焦点是:Delphi系列有没有Y2K问题呢?

答案当然是肯定的。从 Delphi4 起,Inprise 公司就在系统单元 Sysutils. pas(dcu)中增加了TwoDigitCenturyWindow 这一关键词。它表示从当前年份起加到两位数的年份的数值

缺省为50(年)

也就是说允许Y2K拖后50年才发生。可以这样举一简单的例子:

当前日期为 1999年

调用 FormatDatetime(LongdateFormat

'20-11-04') 为 2020年11月4日。而 FormatDatetime(LongdateFormat

'50-11-04') 却为 1950年 11月4日 而不是 2050 年11月4日。

因此,现在的Y2K问题方案只是在争取时间,而没有彻底解决. 理想的解答是到了 2000年,年份的输入和表示应该是4位数,而不是两位,这样才能除去世纪之交的二义性。

沿着这一思路 Delphi5中最重要的插件 MIDAS 3.X(多层分布式应用服务)

也是建立在这一时间差基础之上的

它往往和 BDE 的Y2K 修正日期范围联系在一起。需要注意的是:运行时(RTL)控件,Inspire 建议在日期多应用场合,如出生登记,到期付款凭证等事务处理应用时,可根据自己的实际需要来设定(TwoDigitCenturyWindow) 这一初始值,最好实在窗口建立时,及 OnCreate 事件里面设置。Inprise 建议用 100年的世纪窗口(the century window)(相对2000年以前)

大部分程序员都喜欢这样设 TwoDigitYearCenturyWindow := CurrentYear - 1950。

100年的世纪窗口(the century window)应作如下解释 :

设 TwoDigitCenturyWindow := 20

那么从现在起,时间支持是20年,其中80年应为过去时间。如:当前时间是 1999年,FormatDatetime(LongdateFormat

'18-11-04') 为 2018年11月4日,超过了期限

FormatDatetime(LongdateFormat

'20-11-04') 为 1920年11月4日。

在标准控件中,与日期输入有关的插件是 TMaskEdit.及其派生的子类。TdateTimePicker 插件在没有安装最新的微软 Visual Dev 6.0 以前,到了2000年2月29日时,不能显示正确的日期。另外由于操作系统的原因,COMCTL32.DLL如果不更新到 4.72.2106.4 版本(及以后),那么在 NT 4 或视窗 95 操作系统上

TdateTimePicker 将会用1752 替换所有的奇数。

在数据库控件中,漏斗和过滤(Filter)函数将 '00-1-1' 转换到 ’1900-1-1'

在用 Locate 指令时,'00-1-1' 到 '99-1-1'期间将被转换成 '20XX-1-11'

'30-1-1' 到 '99-1-1' 期间将被转换到 '19XX-1-1'.原因是 Locate 使用变数(variants)进行定位,日期定位并被没有通过 Delphi 的运行时库进行,而是调用了 WIN32 API 函数转换到日期类型。这是由于 OLE 自动服务器对象的 OLE 字串转换到日期类型的规则造成的。尤其是当你调VarToDateTime 函数去试图从一包含日期的字串分离出 TDateTime 类型时。一些数据库操作在内部使用变体来提取实际数据,TDataset.Locate 和 Tparams 类将依照 OLE 变体转换规则来实施具体操作,而非通过Delphi的"字串-日期"转换过程。

因此

Delphi IDE 环境和 DBExplorer 都在安装时设定了50 年的世纪窗口,其设定对独立运行的 SQL Explorer.exe 也有效,在数据浏览时的"2-4"年份转换都是这样设定. 不过,这些值是可以修改的。IDE 的注册表项为

HKEY_CURRENTUSER\Software\Borland\Delphi\4.x\ Globals\TwoDigitYearCenturyWindow

.

DBExplorer.EXE 的注册表项为

HKEY_CURRENTUSER\Software\Borland\Database Explorer\2.x\DBXForm\TwoDigitYearCenturyWindow

.

如果将TwoDigitYearCenturyWindow变为0,那么 Delphi3、Delphi4、Delphi5 对日期的解释都将一模一样只处理两位数年份。

J-MIDAS (Java Midas) 和 J-TClientDataSet 是依靠 JBUILDER 引擎对日期格式进行解释,所以对两位数的年份,JBUILDER 只保留了 20 年的有效期。

现在回头来看一下 Delphi 3。由于先天不足,对仍还在使用他的程序员们来说,多少是有些失望。不过,如果进行一番改造,再把 BDE 升级到 5.1 以上,或用 ADO 2.1 代替 BDE,还是可以正常在低档机上披星戴月,披挂上阵。

我们先看一下 Delphi 3 中对年份处理的 EraToYear 函数。该函数返回一符号整形值。定义如下:

function EraToYear(Year: Integer): Integer;

begin

if SysLocale.PriLangID = LANG_KOREAN then

begin

if Year <= 99 then

Inc(Year

(CurrentYear + Abs

(EraYearOffset)) div 100 * 100);

if EraYearOffset > 0 then

EraYearOffset := -EraYearOffset;

end

else

Dec(EraYearOffset);

Result := Year + EraYearOffset;

end;

我们看到,Delphi 对 2000 年并未加以考虑,其中 Year 获取年份的后两位。这样的话,到了2000 年,日期将回到从前。故而,必须将此函数加以修改,以便使我们的日期转换能通过2000 年。首先,按照 Delphi 一贯的兼容性做法,应该在单元头部声明一 TwoDigitCenturyWindow 的 Byte 变量。在单元初试化时(initialization)

把其附值为 50。其次,对 EraToYear 做如下改动:

function EraToYear(Year: Integer): Integer;

begin

if SysLocale.PriLangID = LANG_KOREAN then

begin

if Year <= 99 then

Begin

if Year > TwoDigitYearCenturyWindow then

Inc(Year

(CurrentYear + Abs(EraYearOffset))

div 100 * 100)

else

Inc(Year

(2000 + Abs(EraYearOffset))

div 100 * 100);

end;

if EraYearOffset > 0 then

EraYearOffset := -EraYearOffset;

end

else

Dec(EraYearOffset);

Result := Year + EraYearOffset;

end;

然后对 ScanDate 函数做相应的处理,以使其适应 2000 年过度。

function ScanDate(const S: string; var Pos: Integer;

var Date: TDateTime): Boolean;

var

DateOrder: TDateOrder;

N1

N2

N3

Y

M

D: Word;

EraName : string;

EraYearOffset: Integer;

.....

begin

Y := 0;

M := 0;

D := 0;

Result := False;

DateOrder := GetDateOrder(ShortDateFormat);

EraYearOffset := 0;

if ShortDateFormat[1] = 'g' then

// skip over prefix text

begin

ScanToNumber(S

Pos);

EraName := Trim(Copy(S

1

Pos-1));

EraYearOffset := GetEraYearOffset(EraName);

end

else

if AnsiPos('e'

ShortDateFormat) > 0 then

EraYearOffset := EraYearOffsets[1];

if not (ScanNumber(S

Pos

N1) and ScanChar(S

Pos

DateSeparator) and

ScanNumber(S

Pos

N2)) then Exit;

if ScanChar(S

Pos

DateSeparator) then

begin

if not ScanNumber(S

Pos

N3) then Exit;

case DateOrder of

if not ScanNumber(S

Pos

N3) then Exit;

case DateOrder of

doMDY: begin Y := N3; M := N1; D := N2; end;

doDMY: begin Y := N3; M := N2; D := N1; end;

doYMD: begin Y := N1; M := N2; D := N3; end;

end;

if EraYearOffset > 0 then Y := EraToYear(Y);

{ 在这里 Century Window 发挥作用 }

if Y <= 99 then

Begin

if Y > TwoDigitYearCenturyWindow then

Inc(Y

CurrentYear div 100 * 100)

else

Inc(Y

2000);

end;

end else

.....

由此,Delphi 3 已经可以渡过 2000 年了,不过,Inprise 建议 Delphi 3 的版本为 3.02。如果是 3.0 极其以下(不支持 MIDAS 1.

X) 象Delphi 1.x(16位)、Delphi 2.x(32位)不如直接升级到 Delphi 4.02. 有条件的爱好者用 Delphi 5 就更好了。

AWS副总裁谈数据中心网络打造 【最具价值CTO评选秀】出门问问CTO雷欣:从技术极客到核心管理的秘密 《近匠》APICloud:“云”+“端”一体的移动API提供者 Oculus移动SDK发布!John Carmack操刀、集成Unity 4.5 11月15日深圳见!深圳微信开发者大会公布全部议程 参与2014中国大数据行业大调查 BDTC门票等你拿 HTML5规范尘埃落定,5个开发工具推荐 盘点最受开发者喜爱的Android 5.0 Lollipop API IoE Day侧记:想开发智能硬件?先要弄明白这几个问题 【问底】许鹏:使用Spark+Cassandra打造高性能数据分析平台(二) 微软承诺所有Lumia WP8设备将升级至Win10,用户会买账吗? 周末,深圳微信开发者大会等您来!(参会必读+名单) 营造云安全生态链 第五届云安全联盟高峰论坛在京顺利召开 中国大数据六大技术变迁记 【最具价值CTO评选秀】当当网CTO熊长青:结合行业及技术发展,规划技术方向 社交颠覆传统,环信技术交流沙龙纪实(组图) 揭秘经典案例炼成之道 微信开发者大会精华回顾 从一家电子商务网站学到的经验教训 【最具价值CTO评选秀】极路由CTO康晓宁:极客转型CTO的感悟 盘点这些年来的“微信万能论” 《近匠》亲加通讯云:IM即时通讯API的极致服务者 TCL杯HTML5智能电视开发大赛完美落幕,8项获奖应用大揭晓! Xcode 6.2 Beta发布,支持WatchKit的iOS 8.2 SDK来了! 【最具价值CTO评选秀】携程高级技术副总裁叶亚明:从呼叫中心到移动互联网的演进 为什么靠谱的公司都应该参加CTO评选? 【深度剖析】微软开源.NET:战略重心已从PC转移到云端 专访POWER 8编程挑战赛选手黄文超:非科生的编程算法之路 BDTC 2014干货精彩不断,四大全天技术论坛议题全面曝光 全功能API!开源2D游戏引擎Firmament 微信公众平台新增“微信连Wi-Fi”功能,打通线上线下闭环 马化腾:微信在一线城市活跃 QQ增长从城市到农村 回复:機會不要錯過! 華強科技有限公司幫你成就軟件工程師的夢想! How to access SMB/CIFS from Sun workstation? 谁来拿分啊。我有一个问题自己解决了,但没有给分的对象。 问一个message Bean的问题,up有分 [EJB]HelloWorldBean正确编译配置和执行,但"HelloWorld"却不见了 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 如何让主界面变成三维的那种 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 用什么组件能得到网站上的末知大小的文件? 问一个简单的问题 还是有问题关于获得选中安钮的当前行,请进>> 请教简单问题,如何将菜单的一个选项隐藏。就是类似cb的将Visible=false的做法!! 连接ACCESS数据库的问题? 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 如何提取一个EXE文件的特征码??要高分者和高手进!!!!来者有分! j2ee配置问题,大家帮我看看,错误出在哪里?谢了! 如何在注册表中修改使得浏览的网页可以即时通过工具栏的“编辑”调用DW修改? "聊聊"网站是怎样建的?用拉什么技术,可以即使聊天? 类型转换,非常奇怪的问题。高手进来 搞纯C++的大虾请进 关于MDI Child窗口的一个问题? DOS6.22的下载及6.0源码 sql语句问题:怎样从表中选出字段值包含在一个变量字串的那条记录。100分!在线等待! 关于那个mesh绕自己中心(注意是自己中心)旋转的问题我还没有解决 抛砖引玉: 证券行业软件之数据库存储。 如果下面这个问题谁能解决,我跪下来拜他三下:在WIN2000里,通过更改注册表,以达到更改IE的页面设置(一定要能更改横向:orientation和 过程的问题!!! 一个非常难的问题---挑战这里所有的高手!(解决了,分数我可以追加到200) 用vc7时候怎么导入一张图片作资源?还有怎么添加popup菜单 有关取得一个Tree Control的一个Notify的问题! 关于delphi中用ADO连接数据库的问题!!(欢迎up)在线等待! 急问各位高手,在CB里怎么设置数据库的相对路径。 有一份北京的工作,需要懂php+mySql+linux,有兴趣的请和我联系 请问能否把报表预览控件中的“CLOSE”安钮改成中文的”关闭“安钮? 如果有一可用程序,打开什么文件(后缀名)能运行?我是新手 怎么关闭一个窗体? 多对多关系是不是要做一个对应表 定时器问题。。。。。。 为什么我用activeskin后~~ 不能放其他控件的~ 例如Shape 还有 media player这些控件啊 求解一个“排序”的问题。 哪个有图形按钮的类,给我一份 关于程序员考试的学习问题。。 请问哪里有XML V4。0下载呀1 再叙PB7获取当前路径问题 菜鸟问题:请问jar是干什么用的,怎么用? 调查一下,你们除了到csdn外,还到哪里呢?我现在一上网就跑到这里来,别的地方我都忘了。 当鼠标移动到弹出菜单的某项时,菜单对应项改变颜色。是如何做到的? 请问如何在VB中存取OLE字段中的电子表格,谢谢,我是新手,请帮忙。 急救。。语句错在哪?adoquery1.SQL.add('select ygdm,ygxm from user where ygdm='''+edit1.text+''''); 系统有win2000,重装win98后没有系统引导菜单了 不知道在MFC中用CBrush怎样来实现空画刷. 现在四川渠县的房价如何? 英语翻译就是这题我题目都没太看懂 以走好人生第一步路为主题的作文想一个好题目 楼顶、屋顶、房顶、厂房、彩钢板隔热,建筑的楼顶、屋顶、房顶、厂房、彩钢板隔热防水涂料如何,听朋友介绍,北京志盛威华公司的防晒隔热涂料隔热解决建筑的楼顶、屋顶、房顶、厂房、 英语翻译我想问的是,如果题目里面说是 一个DNA有1200个碱基,那么它控制蛋白质合成的DNA的碱基是不是只要算600个,就是说 控制蛋白质合成DNA的碱基只是算转录链上的碱基?那么,如果说是控制 正弦波电压半波整流波形的波峰因数是多少?最好提供准确值. 铝箔表面变黑 是什么物质 什么是隔热保温涂料啊?隔热保温涂料配方是哪些啊想要了解一下隔热保温涂料配方,有没有好一点的公司能够帮助分析一下啊? 生物中复制、转录、翻译之间的联系和相互关系最好能列表,谢谢! 暑假生活37页的所有语文五年级冀教版 轻松快乐过暑假七下语文,英语答案(江苏人民出版社的) 为什么种子没有土壤也能发芽吗 语文暑假生活 冀教版 五年级下册 32页阅读练习怎么写?32页阅读练习  郑人有且置履者,先自度其足而置之其坐,至之市而忘操之.已得履,乃曰:“吾忘持度.”反归取之.及反,市罢,遂不得履. 江苏轻松快乐过暑假七年级2011-2012 语文 英语全部的答案好的再给分 白醋的美容功效 语文暑假生活 冀教版 五年级下册第13页第二大题 急哦.........二、请根据意思分别填写各属于哪种读书方式. 例:拿到一本书,从头到尾简单看一遍,叫(略读).  1.从大量 甲、乙两人共有存款900元,甲的存款是乙的五分之四,乙有存款多少元?(列式)急需!谢谢! 这想成语怎么填 水仙花和丝瓜花它们花中是否都有雄蕊和雌蕊? 1只鹅=1只鸡+1只兔+1只鸟=3只兔=2只鸡 问1只鹅=几只鸟 白醋会腐蚀金属吗?我现在天天用白醋洗脸,但是我手上戴着手链,时间一长会被腐蚀吗? 要全部的哦!是远方出版社出版的! 搜狗输入法打繁体字 白醋为什么会腐蚀鸡蛋 长江三峡是哪三峡? 怎么用搜狗打繁体字 林大爷养了300只鸡,养的鹅的只数比鸡少6分之1.林大爷养的鹅有多少只?这个问题我没有学,我生病了,如果对了, p20 指鹿为马 和 伶牙俐齿 的对子p21 ( )上树——全靠一张嘴p25 鲁肃上了孔明的船——( )p29 林冲误闯白虎堂——( ) 诸葛亮大摆空城计——( )p30( )打宋江——过后赔礼p37 根据诗 在细胞生物中,RNA是DNA转录来的?如题 王大娘去农贸市场卖了2只鹅和6只鸡.一只鸡的价钱是1只鹅的2分之1.王大娘总共卖得的钱相当于()只鸡的钱,或者相当于()只鹅的钱 花的雄蕊有哪些部分组成 高中生物有关DNA的转录下图表示某正常基因及指导合成的多肽顺序.D位点发生的突变导致肽键延长停止的是(除图中密码子外,已知GAC天冬氨酸,CGU甘氨酸,GGG甘氨酸,AUG甲硫氨酸,UAG终止)A.G/C→A 李大爷家有鸡和鹅200只、鹅比鸡少40只、鹅和鸡各多少只? 花最重要的结构是雌蕊还是雄蕊?快 翻译从3'端开始还是5'端开始?转录呢?DNA呢? 英语翻译A.DNA、RNA、蛋白质B.DNA、RNA、氨基酸 花的雄蕊由什么构成? 苏教版快乐暑假语文答案 作文如何迈好高中第一步 铝材 小料是什么 深圳激光泵浦灯|深圳激光泵浦灯批发网|深圳激光泵浦灯厂家在哪里? 作文大全800字如何迈好高中第一步 求铝窗开料软件,铝材开料软件, 灯泵浦激光打标机有没有半导体激光打标机好用同标题 求300V降到220v的直流降压电路图负载有600W不能用线圈 YAG金属激光打标机多少钱 中国黄金手链上千足金什么意思? 英语翻译决定氨基酸的密码子指的为什么是mRNA上的三个相邻碱基,而不是DNA上的三个相邻碱基?基因应该是决定蛋白质的合成啊. 一辆汽车从甲地开往乙地,9小时行了全程的九分之五,照这样计算,行完全程要几小时?(用比例知识解)急,帮个忙啊!~ 你们用搜狗打了多少字了- -输入统计:共24天28938字今日已打:168字 小麦播种之后需要多少天才能镇压?是等小麦出苗了以后吗?知道的请回答, 正常汽车行驶速度80?(单位) 请问大家的搜狗打了多少字? 小麦一般几天出苗? 小轿车行驶速度是每小时80千米,高速铁路列车的行驶速度比小轿车行驶速度的4倍还多30千米,高速铁路列车的行驶速度是多少? 用搜狗怎么打日本字拜托了各位 谢谢 8月30日过35小时又11分等于几日几时? 800个()小于80个()小于8个()填适当数量单位 转录和翻译的模板分别是什么? 小麦多长时间出苗
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘