📄 in_date.htm
字号:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft Word 97">
<TITLE>也 谈Delphi 中 的 日 期 输 入 </TITLE>
</HEAD>
<BODY>
<FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">也 谈Delphi 中 的 日 期 输 入 </P>
<P ALIGN="JUSTIFY">河 海 大 学 计 算 机 系 研 </P>
<P ALIGN="JUSTIFY">张 亮 </P>
<P ALIGN="JUSTIFY">---- 日 期 输 入 虽 然 是 小 事, 但 却 几 乎 每 一 个 程 序 里 都 会 碰 到, 处 理 不 好 也 会 惹 出 许 多 麻 烦(2000 年 问 题 即 是 日 期 引 起 的 世 界 性 麻 烦)。 现 谈 一 谈 笔 者 在Delphi 编 程 中 对 日 期 处 理 的 一 些 经 验 和 感 受, 请 大 家 指 正。 </P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">---- 在 程 序 中 使 用 现 成 的 控 件 是 现 在 编 程 的 一 种 趋 势, 其 实,DateTimePicker 就 是 一 个 很 好 的 控 件, 关 键 是 如 何 灵 活 变 通 地 运 用。DateTimePicker 是Microsoft 向Windows95 通 用 控 件 库 新 添 的 控 件, 是 输 入 日 期 和 时 间 的 简 单 工 具, 具 有 良 好 的 图 形 界 面。 该 控 件 在Delphi 名 为Win32 的 控 件 面 板 中, 对 其kind 属 性 的 选 择 可 以 确 定 是 输 入 时 间 还 是 日 期, 在 日 期 输 入 中 又 有 一 些 属 性 可 供 不 同 的 选 择, 其 中Datamode 有dmUpDown 和dmComboBox 两 个 选 项, 选 择 前 者, 就 可 以 在 输 入 日 期 时, 用 鼠 标 点 激 向 上 或 向 下 按 钮, 从 而 可 以 非 常 方 便 地 对 年、 月、 日 进 行 递 增 或 递 减; 选 择 后 者, 在 运 行 时 用 鼠 标 点 激, 就 会 弹 出 一 个 界 面 友 好 的 对 话 框, 从 而 可 以 从 中 选 取 日 期, 这 时 日 是 从 相 应 的 月 历 表 中 选 取, 年 和 月 则 仍 是 通 过 按 箭 头 按 钮 递 增 或 递 减。 但 不 管 是dmUpDown 还 是dmComboBox, 都 可 以 在 其 上 直 接 输 入 年 月 日 的 值, 并 且 自 动 地 保 证 日 期 的 有 效 性( 如 闰 年 问 题 等), 因 此 完 全 涵 盖 了《Delphi 中 日 期 输 入 法 二 则》 一 文 中 自 己 定 制 的 日 期 输 入 窗 口 的 功 能 和 速 度。Dateformat 属 性 有dfLong 和dfShort 两 种 选 择, 前 者 为 长 日 期 型( 如1999 年2 月16 日, 如 果 得 到 的 不 是 理 想 的 形 式, 可 调 整Windows 控 制 面 板 上 区 域 设 置 中 的 日 期 格 式 以 及DateTimePicker 的Font 属 性 的Charset 值, 一 般 情 况 取DEFAULT_CHARSET 或GB2312_CHARSET 即 可), 后 者 为 短 日 期 型( 如99-2-16), 考 虑 到 跨 世 纪 问 题, 短 日 期 要 慎 用。 但 长 日 期 型 的 值 不 可 直 接 作 为 日 期 值 赋 给 日 期 型 的 变 量, 要 做 一 点 转 换 工 作, 举 例 如 下: </P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">procedure Tform1.DateTimePicker1CloseUp</P>
<P ALIGN="JUSTIFY">(Sender: TObject);</P>
<P ALIGN="JUSTIFY">var</P>
<P ALIGN="JUSTIFY"> Year, Month, Day: Word; </P>
<P ALIGN="JUSTIFY"> Datetime:TDatetime;</P>
<P ALIGN="JUSTIFY">begin</P>
<P ALIGN="JUSTIFY">DecodeDate(DateTimePicker1.datetime,</P>
<P ALIGN="JUSTIFY"> Year, Month, Day);</P>
<P ALIGN="JUSTIFY">//将DateTimePicker1的年月日的值分别赋给</P>
<P ALIGN="JUSTIFY"> Year, Month, Day</P>
<P ALIGN="JUSTIFY">EditDATE.Text:=inttostr(year)+'-'</P>
<P ALIGN="JUSTIFY"> +inttostr(Month)+'-'+inttostr(Day); </P>
<P ALIGN="JUSTIFY">// EditDATE为TDBEdit型的编辑框,</P>
<P ALIGN="JUSTIFY"> 对应一个日期型的数据表字段</P>
<P ALIGN="JUSTIFY">//若将其变为短日期型的,</P>
<P ALIGN="JUSTIFY"> 可以发现Delphi把短日期即00--99年都解释</P>
<P ALIGN="JUSTIFY">//为1900--1999年,</P>
<P ALIGN="JUSTIFY"> 而不受Windows控制面板中区域设置中格式的控制</P>
<P ALIGN="JUSTIFY">Datetime:=EncodeDate(Year,Month,Day); </P>
<P ALIGN="JUSTIFY"> //把年月日合成为日期值</P>
<P ALIGN="JUSTIFY">end;</P>
<P ALIGN="JUSTIFY">---- 上 面 这 个 小 程 序 中,form1 的DateTimePicker1 的Dateformat 属 性 为dfLong,Datamode 的 属 性 为dmComboBox。 DateTimePicker1CloseUp 为 日 期 输 入 对 话 框 缩 起 时 发 生 的 事 件, 也 可 以 用OnChang 事 件, 即DateTimePicker 发 生 变 化 时 触 发, 则Datamode 属 性 无 论 取 何 值 都 可 使 用。 </P>
<P ALIGN="JUSTIFY">---- 可 见 对DateTimePicker 控 件 只 要 稍 加 处 理 即 可 美 观 快 捷 地 解 决 日 期 输 入 问 题。, 默 许 状 态 下 日 期 只 能 在1752 年9 月14 日 至2999 年12 月31 日 之 间, 但 可 以 通 过 对 其mindate 和maxdate 赋 值 扩 大 选 择 范 围。 </P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">---- 但 是 该 控 件 也 有 一 点 缺 憾, 对1899 年12 月30 日 以 前 的 数 值 录 入 须 小 心, 容 易 出 错。 这 倒 引 入 了 另 一 个 话 题, 即Delphi 中 的 日 期 型( 即Tdate 型 ) 的 定 义 为:type TDate = type TDateTime; 而TdateTime 型 的 定 义 为:type TDateTime = type Double; 可 见 日 期 型 归 根 到 底 是 双 精 度 浮 点 型(Double 型),Delphi 规 定 其 整 数 部 分 为1899 年12 月30 日 以 来 的 天 数, 小 数 部 分 则 为24 小 时 按 比 例 分 割 存 储, 例 如: </P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">0	 12/30/1899 12:00 am 2.75	 1/1/1900 6:00 pm</P>
<P ALIGN="JUSTIFY">-1.25	 12/29/1899 6:00 am 35065	 1/1/1996 12:00 am</P>
<P ALIGN="JUSTIFY">---- (12:00 am 即 为 凌 晨0 点,11:00 am 即 为 早 晨11 点,12:00 pm 即 为 中 午12 点,1:00 pm 即 为 中 午1 点) </P>
<P ALIGN="JUSTIFY">---- 而 在Delphi1.0 中, 其 整 数 部 分 为 公 元1 年 以 来 的 天 数, 之 所 以 这 样 改 动 是 为 了 更 好 地 与OLE2.0 相 兼 容。 对 于 日 期 的 运 算 一 定 得 注 意 类 型 的 匹 配, 而 且 由 于 日 期 型 实 则 为Double 型, 所 以 可 对 其 进 行 加 减 乘 除 运 算, 现 举 例 如 下: </P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">procedure TForm1.Table1CalcFields(DataSet: TDataset);</P>
<P ALIGN="JUSTIFY">var</P>
<P ALIGN="JUSTIFY">t1, t2: tDateTime; </P>
<P ALIGN="JUSTIFY">begin</P>
<P ALIGN="JUSTIFY">table1d1.asDateTime := Date + 2;</P>
<P ALIGN="JUSTIFY"> {or table1d1.value := date + 2;} // Date为系统日期</P>
<P ALIGN="JUSTIFY">table1d2.asDateTime := Date - 2;</P>
<P ALIGN="JUSTIFY"> //d1,d2为表table1中date or dateTime型字段。</P>
<P ALIGN="JUSTIFY">t1 := table1d1.asDateTime;</P>
<P ALIGN="JUSTIFY">t2 := table1d2.asDateTime;</P>
<P ALIGN="JUSTIFY">table1d3.asInteger := trunc(double(t1) - double(t2));</P>
<P ALIGN="JUSTIFY"> // trunc为取整函数,d3为表table1</P>
<P ALIGN="JUSTIFY"> 中integer型字段,结果为日期d1和d2的差。</P>
<P ALIGN="JUSTIFY">end;</P>
<P ALIGN="JUSTIFY">---- 另 外, 在Delphi 中 可 以 方 便 地 显 示 系 统 时 间, 只 要 利 用DateToStr(Date) 及TimeToStr(Time) 函 数 即 可 实 现。 也 可 以 通 过 调 用WindowsAPI 函 数 来 实 现 对 系 统 时 间 的 设 置, 具 体 方 法 如 下: </P>
<P ALIGN="JUSTIFY">procedure TForm1.Button1Click(Sender: TObject);</P>
<P ALIGN="JUSTIFY">begin</P>
<P ALIGN="JUSTIFY"> Edit1.Text:='1998-12-12 12:00 am';</P>
<P ALIGN="JUSTIFY">end;</P>
<P ALIGN="JUSTIFY">//可在运行时,也可在Edit1中重新键入日期,</P>
<P ALIGN="JUSTIFY"> 但须注意格式。</P>
<P ALIGN="JUSTIFY">procedure TForm1.Button2Click(Sender: TObject);</P>
<P ALIGN="JUSTIFY"> var</P>
<P ALIGN="JUSTIFY"> systemtime:Tsystemtime;</P>
<P ALIGN="JUSTIFY"> DateTime:TDateTime;</P>
<P ALIGN="JUSTIFY"> begin</P>
<P ALIGN="JUSTIFY"> DateTime:=StrToDateTime(Edit1.text);</P>
<P ALIGN="JUSTIFY"> DateTimeToSystemTime(DateTime,systemtime);</P>
<P ALIGN="JUSTIFY"> SetLocalTime(SystemTime);</P>
<P ALIGN="JUSTIFY"> GetLocalTime(SystemTime);//读取北京东8区时间</P>
<P ALIGN="JUSTIFY"> DateTime:=SystemTimeToDateTime(SystemTime);</P>
<P ALIGN="JUSTIFY"> Edit2.Text:=DateTimeToStr(DateTime);</P>
<P ALIGN="JUSTIFY">end;</P>
<P ALIGN="JUSTIFY">//Button2点激后,系统时间就变为Edit1中的时间了。</P></FONT></BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -