在编写应用程序时
我们需要经常与时间和日期打交道
因此经常需要一些对时间的控制技术
在Delphi中
提供了一整套对日期和时间的操作函数
在此
我将详细介绍一下在Delphi中的时间操作技术
希望能对大家有所帮助
一Delphi中的用于表示时间的类型
首先看一看在delphi中用于描述时间的几种数据结构对时间的操作其实就是对这些结构的操作
1TDateTime类型
Delphi中最常用的表示日期时间的数据类型TDateTime类型和普通的整形数一样你可以给日期定义一个日期型变量以便在程序中进行操作TdateTime类型实质上是一个Double型的数在Delphi中是这样定义TdateTime类型 type TDateTime = type Double 具体的算法是用Double数的整数部分表示日期以年月日为基准点以天为单位进行加减如数字表示年月日数字表示年月日而小数部分则用来表示时间其值为欲表示的时间与一整天总时间的比值如早上点就是/=而早上:就是(*+)/(*)=
下面给出几个例子说明TDateTime类型 与Double类型的交互关系
// ::
// ::
// ::
// ::
相信大家一定能自己理解TdateTime与Double之间的转换方法因此从根本上对TDateTime的操作与Double完全一样
2TTimeStamp 类型
这是一个用来描述日期与时间的一个结构类型在Delphi中是这样定义的
type
TTimeStamp = record
Time: Integer; {从午夜点开始到指定时间的毫秒数 }
Date: Integer; {以本日为基准到指点日期的天数}
end;
和TDateTime相比可更直观表示高精度的时间一般用于毫秒级的运算以及用于表示较长的时间
3PsystemTime 类型
一个用于WinApi中对时间操作的指针型结构他的定义为
type
PSystemTime = ^TSystemTime;
TSystemTime = record
wYear: Word;
wMonth: Word;
wDayOfWeek: Word;
wDay: Word;
wHour: Word;
wMinute: Word;
wSecond: Word;
wMilliseconds: Word;
end;
这个结构多用于调用WinApi操作时使用
在了解了各种时间类型的本质后相信大家都有一套操作这些类型的时间的想法不过在Delphi中还提供了一整套用于操作时间的过程函数这些过程和函数都定义在SysUnit这个单元中现在就向大家介绍Delphi中相关函数
二用于时间操作的函数
1Date函数
定义Date: TDateTime;
作用返回当前的日期
范例CurrentDate := Date;
2DayOfWeek函数
定义function DayOfWeek(Date: TDateTime): Integer;
作用得到指定日期的星期值返回~代表周日到周六
3IncMouth函数
定义function IncMonth(const Date: TDateTime; NumberOfMonths: Integer): TDateTime;
作用求给定的日期Data在NumberOfMonths个月后的日期
范例Date := IncMonth(date);
如果今天是则Date就是
4IsLeapYear函数
定义function IsLeapYear(Year: Word): Boolean;
作用判断指定的年份是否是闰年
范例if isLeapYear() then ShowMessage(该年是闰年);
5Now函数
定义function Now: TDateTime;
作用用于取得当前的日期时间
范例CurrentDateTime := Now;
6ReplaceDate 过程
定义procedure ReplaceDate(var DateTime: TDateTime; const NewDate: TDateTime);
作用使用参数Newdate日期部分替换参数DateTime的日期部分但不改变时间部分
7ReplaceDate 过程
定义procedure ReplaceTime(var DateTime: TDateTime; const NewTime: TDateTime);
作用使用参数Newdate时间部分替换参数DateTime的时间部分但不改变日期部分如果上述这两个过程一起用就相当于赋值了
8Time函数
定义function Time: TDateTime;
作用返回当前的时间
范例CurrentTime := Time;
三各种时间类型之间的转换函数
1DateTimeToFileDate函数
定义DateTimeToFileDate(DateTime: TDateTime): Integer;
作用 将一个TDateTime类型的时间转化为Dos环境中的时间Dos环境下对时间的访问方法和VCL中的TdateTime类型不一样在进行文件操作时为了保持时间的一致性需要使用DateTimeToFileDate函数进行转化 返回的Integer的值就是Dos下的用于描述时间的值
2DateTimeToSystemTime 过程
定义procedure DateTimeToSystemTime(DateTime: TDateTime; var SystemTime: TSystemTime);
作用将一个TDateTime类型的时间转换为Win API函数所使用的TSystemTime类型在使用WinApi函数操纵时间时用到
3SystemTimeToDateTime 函数
定义function SystemTimeToDateTime(const SystemTime: TSystemTime): TDateTime;
作用将一个在WinApi函数中得到的TSysTemTime类型的数转换为TDateTime类型
4DateTimeToTimeStamp 函数和TimeStampToDateTime 函数
定义DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;
function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;
作用用于在TDataTime类型与TTimeStamp之间进行互相转换TDataTime 用一个double描绘一个时间而TTimeStamp则是采用两个整形数分别描述时间两种类型的区别可参考文章开始处的数据类型描述部分
5EncodeDate 函数
定义function EncodeDate(Year Month Day: Word): TDateTime;
作用 输入年(year)月(month)日(day)的值将该日期返回为TDateTime类型年的范围为月份的范围为日期的范围视当月的情况而定如果输入的值超出范围则将产生一个EConvertError错误
6DecodeDate 过程
定义procedure DecodeDate(Date: TDateTime; var Year Month Day: Word);
作用输入一个TDateTime类型的日期将其转为年(Year)月(Month)日(Day)的值如果输入值为或小于则年月日均为
7EncodeTime 函数
定义EncodeTime(Hour Min Sec MSec: Word): TDateTime;
作用输入小时(Hour)分(min)秒(Sec)微秒(MSec)的值返回一个TDateTime类型的时间该值为一个介于至之间的小数Hour的取值范围为Min的取值范围为Sec的取值范围为MSec的取值范围为如果输入值超出范围则产生一个EConvertError 错误
8DecodeTime 过程
定义procedure DecodeTime(Time: TDateTime; var Hour Min Sec MSec: Word);
作用输入一个时间将其转换为小时(Hour)分(min)秒(Sec)微秒(MSec)的值
四TDateTime类型与字符串型转换函数
1DateTimeToStr 函数DateToStr 函数和TimeToStr函数
定义function DateTimeToStr(DateTime: TDateTime): string;
function DateToStr(Time: TDateTime): string;
function TimeToStr(Time: TDateTime): string;
作用将一个TDateTime类型的数转换成字符串DateTimeToStr转换日期和时间DateToStr只转换日期TimeToStr只转换时间转换后的输出效果为YYYYMD HMS
2StrToDateTime函数StrToDate函数和StrToTime函数
定义function StrToDateTime(const S: string): TDateTime;
function StrToDate(const S: string): TDateTime;
function StrToTime(const S: string): TDateTime;
作用将带有日期时间格式的字符串转化成TDateTime其中S必须是一个有效的字符串如
YYMMDD HH:MM:SS格式否则就会触发EConvertError事件提示错误信息
时间部分的字符串必须是由~个的数值字串构成并且采用在Windows区域设置中设置的分隔字符进行分隔其格式要求符合在Windows区域设定中的设定其中HHMM(小时分钟)必须添加SS(秒)可选也可以在后面加入 Am和Pm区分上下午这时候系统将认为采用小时表示法否则认为采用小时表示法
日期部分的格式要求符合Windows区域设置中的短日期格式也是由~个的数值字串构成如果在字符串中只有个数则认为是指定了月份和日期年份采用当前年份如果在区域设置中采用两位年份的表示方法则系统将会采用以下方法处理
当前年份起始年份基准值输入年份
输入年份
输入年份
首先在区域设置中取得两位年份的起始年份如在区域设置中设两位年份范围为年则起始年份为年如果这个起始年份为则认为两位年份表示的都是本世纪如果其实年份大于 则采用当前年份减去起始年份的值这个值称为基准值大于等于这个值则认为事本世纪否则认为是下世纪下面给出几个例子说明
DateTimeToString 过程FormatDateTime 函数
定义procedure DateTimeToString(var Result: string; const Format: string; DateTime: TDateTime);
function FormatDateTime(const Format: string; DateTime: TDateTime): string;
作用通过定义Format字串中的格式得到要输出时间字符串例如要输出今天是年月日星期五就可以用这两种方法这两个方法的作用相同只是一个是通过共享变量取得输出字符串值在Result中一个是通过返回值取得输出字符串DateTime参数是希望输出的日期值Format由格式标志与附加字符串组合而成附加字串用圈起就像C中的Printf函数如今天是年月日星期五的Format值就是 今天是yyyy年mm月dd日 ddddyyyymmdddddd都是格式标识各种格式标识的解释如下
d 用一位或两位整数显示日子(-)
dd 用两位整数显示日子不足两位的用补足(-)
ddd 按缩略方式显示当前的星期号如果Windows是英文版则显示为Mon-Sun如果是中文版则显示同dddd
dddd 按完整方式显示当前的星期号如Windows是英文版则显示Monday-SumDay如 果是中文版则显示星期一~星期日
ddddd 按区域设置中的短日期格式输出
dddddd 按区域设置中的长日期格式输出
m 用一位或两位整数显示月份(-)
mm 用两位整数显示月份不足两位的用补足(-)
mmm 使用缩略方式显示月份名称英文版显示为JanDec中文版同mmmm
mmmm 使用完整方式显示月份名称英文版显示为JanuaryDecember中文版为一月~十二月
yy 按两位整数方式显示年份(-)
yyyy 按四位整数方式显示年份(-)
h 用一位或两位整数显示小时(-)
hh 用两位整数显示小时不足两位的用补足(-)
n 用一位或两位整数显示分钟(-)
nn 用两位整数显示分钟不足两位的用补足(-)
s 用一位或两位整数显示秒数(-)
ss 用两位整数显示秒数不足两位的用补足(-)
z 用一位至两位整数显示毫秒数(-)
zzz 用三位整数显示毫秒数不足三位的用补足(-)
tt 按照区域设置中的格式显示日期
am/pm 用于小时制的显示带有AM的则表示从点~点pm代表从点~点
与时间相关的变量
Delphi封装了区域设置的各种信息并以此定义了一系列的变量下面介绍与时间相关的部分变量
* DateSeparator Char
日期分隔符用于分隔年月日
* TimeSeparator Char
时间分隔符用于分隔小时分钟秒
* ShortDateFormatString
区域设置中短日期格式的定义
* LongDateFormat String
区域设置中长日期格式的定义
* ShortTimeFormatString
区域设置中短时间格式的定义
* LongTimeFormat String
区域设置中长时间格式的定义
* TimeAMString String
用来表示上午的字符串
* TimePMString String
用来表示下午的字符串
* ShortMonthNamesarray[] of String;
用于缩略表示月份名称的数组就是在使用FormatDateTime时显示的mmm标识的字符串
* LongMonthNamesarray[] of String;
用于完整表示月份名称的数组就是在使用FormatDateTime时显示的mmmm标识的字符串
* ShortDayNames array[] of String;
用于缩略表示星期名称的数组就是在使用FormatDateTime时显示的ddd标识的字符串
* LongDayNames array[] of String;
用于完整表示星期名称的数组就是在使用FormatDateTime时显示的ddd标识的字符串
* TwoDigitYearCenturyWindowWord = ;
在使用两位年份时的起始年份
好了delphi中关于时间操作的部分基本讲完了在Delphi中还提供了一些新的操作函数不过都比较简单相信大家看帮助都能看懂至于对于时间的一些操作技巧相信看完了本文大家都能有一些这里就不详细描述同一种功能本来就应该有多种的实现方法本文在写作中主要参考了delphi的联机帮助本文介绍的大部分函数在联机帮助中都有范例这里就不一一列举可参考联机帮助希望本文能提高您操作时间技术方面的能力同时也为您在阅读相关的联机帮助时提供一些方便