http://www.cnblogs.com/rogee/archive/2010/09/20/1832035.html

很多时候要用到相差多少天,多少周,多少秒,查了一下资料,整理如下:

首先 uses dateutils;

先自己做了个实例,相关代码如下:

代码

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->uses
dateutils; procedure TForm1.Button1Click(Sender: TObject);
var
sd,nd:Tdatetime;
randid:string;
begin
sd := StrtoDatetime('1981-08-08 00:00:00');
nd := now;
memo1.Clear;
memo1.Lines.Add('开始测试时间差:');
memo1.Lines.Add('起始时间:1981-08-08 00:00:00');
memo1.Lines.Add('终止时间:'+datetimetostr(nd));
memo1.Lines.Add('年:'+inttostr(YearsBetween(sd,nd)));
memo1.Lines.Add('月:'+inttostr(MonthsBetween(sd,nd)));
memo1.Lines.Add('周:'+inttostr(WeeksBetween(sd,nd)));
memo1.Lines.Add('日:'+inttostr(DaysBetween(sd,nd)));
memo1.Lines.Add('时:'+inttostr(HoursBetween(sd,nd)));
memo1.Lines.Add('分:'+inttostr(MinutesBetween(sd,nd)));
memo1.Lines.Add('秒:'+inttostr(SecondsBetween(sd,nd)));
memo1.Lines.Add(#);
memo1.Lines.Add('以秒差为例生成随机数:');
randid := inttostr(SecondsBetween(sd,nd))+inttostr(random())+inttostr(random())+inttostr(random())+inttostr(random());//呵呵,很笨的方法。
memo1.Lines.Add(randid);
end; end.

相关函数如下:

{ Range query functions }

function YearsBetween(const ANow, AThen: TDateTime): Integer;
function MonthsBetween(const ANow, AThen: TDateTime): Integer;
function WeeksBetween(const ANow, AThen: TDateTime): Integer;
function DaysBetween(const ANow, AThen: TDateTime): Integer;
function HoursBetween(const ANow, AThen: TDateTime): Int64;
function MinutesBetween(const ANow, AThen: TDateTime): Int64;
function SecondsBetween(const ANow, AThen: TDateTime): Int64;
function MilliSecondsBetween(const ANow, AThen: TDateTime): Int64;

{ Range spanning functions }
{ YearSpan and MonthSpan are approximates, not exact but pretty darn close }
function YearSpan(const ANow, AThen: TDateTime): Double;
function MonthSpan(const ANow, AThen: TDateTime): Double;
function WeekSpan(const ANow, AThen: TDateTime): Double;
function DaySpan(const ANow, AThen: TDateTime): Double;
function HourSpan(const ANow, AThen: TDateTime): Double;
function MinuteSpan(const ANow, AThen: TDateTime): Double;
function SecondSpan(const ANow, AThen: TDateTime): Double;
function MilliSecondSpan(const ANow, AThen: TDateTime): Double;

找到一篇关于时间函数应用的学习笔记,备份一下。

TDateTime是一个比较常用的类型,用于表达日期时间类型的数据。但是,刚刚接触delphi的新手在使用这个类型的时候往往会不知所措,不知道该怎样使用才能得到自己想要的结果。这里说说我在使用过程中的一点心得,其中大部分的内容是来自于delphi帮助,所以如果看了这篇文章对TDateTime还有什么不清楚的可以去看看Delphi的帮助。另外在这篇文章里我也会告诉大家我使用帮助的心得,这对老手或许是班门弄斧但是对于新手我自认为还是很有帮助的。
一、关于TDateTime
1、TDateTime的基本概念:
根据Delphi的帮助里所说的,TDateTime是date和time例程用来存放date和time变量的,在delphi里TDateTime类型本质上是Double类型的,其中整数位用于表达从1899年12月30日到现在所已经过去的天数,小数部分用于表示当天已经流逝的分数值——有些不明白吧,举个例子:上午6点小数部分就是0.25、中午12点小数部分就是0.5依此类推。
2、常用函数和过程
2.1 Date函数
function Date: TDateTime;
返回当前的日期,实际类型是TDateTime,也就是小数部分为0的DateTime值,小数部分为0代表什么意思呢?根据TDateTime的概念我们知道这代表午夜也就是0点。
2.2 DateToStr
函数的形式:function DateToStr(Date: TDateTime): string;
返回值是个字符串,很有用吧。不过,别高兴的太早,如果你用DateToStr(DateTimePicker.Date),你会发现返回的字符串可能是“04-22-03”,这是为什么呢?这是因为delphi内部有一些系统变量用来定义数字、货币、日期的格式,这些变量delphi称为Currency and date/time formatting variables,有23个。我也没有完全看懂,这里讲几个我搞明白的说说。
var ThousandSeparator: Char;
千分位的符号,一般都是西文的逗号“,”,默认值存放在LOCALE_STHOUSAND变量中(位于windows单元)
var DecimalSeparator: Char;
小数点的符号,一般都是西文的句号“.”,默认值存放在变量LOCALE_SDECIMAL中
var CurrencyDecimals: Byte;
小数点后面保留的位数,一般是2位,默认值存放在变量LOCALE_ICURRDIGITS中
var DateSeparator: Char;
日期的分隔符号,一般使用“-”或“.”,默认值为“-”,默认值存放在变量LOCATE_SDATE中
var ShortDateFormat: string;
短日期格式,一般是“yyyy.mm.dd”,默认值存放在变量LOCALE_SSHORTDATE中
var LongDateFormat: string;
长日期格式,一般是“yyyy.mm.dd”,默认值存放在变量LOCALE_SLONGDATE中
var TimeSeparator: Char;
时间的分隔符,一般是西文的分号“:”,默认值就是这个,默认值存放在变量 LOCALE_STIME中
var TimeAMString: string;
表示上午的字符串,默认为“AM”,默认值存放在变量LOCALE_S1159中
var TimePMString: string;
表示下午的字符串,默认为“PM”,默认值存放在变量LOCALE_S2359中
var ShortTimeFormat: string;
短时间格式,默认值存放在变量LOCALE_ITIME LOCALE_ITLZERO中
var LongTimeFormat: string;
长时间格式,一般为“hh:mm:ss”,默认值存放在变量LOCALE_ITIME and LOCALE_ITLZERO中
所以,如果想开发一个稳健的系统,那么这些系统变量必须要在进入系统的时候进行初始化,下面是我得代码:
SysLocale.PriLangID:=LANG_CHINESE;
DateSeparator:='.';
LongDateFormat:='yyyy.mm.dd';
ShortDateFormat:='yyyy.mm.dd';
TimeSeparator:=':';
LongTimeFormat:='hh:nn:ss';
TimeAMString:='上午';
TimePMString:='下午';
大家一定奇怪,为什么我的LongDateFormat和ShortDateFormat是一样的,老实讲,我也希望能够区分长短日期的格式,但是由于有些关于TDateTime的例程在类型转换的时候要参考ShortDateFormat,所以只能设置成一样的了。
还是继续说DateToStr函数。其他没什么特别的,需要注意的是此函数是根据ShortDateFormat来进行转换的,所以ShortDateFormat我只能设为“yyyy.mm.dd”
说道了DateTimePicker,注意在它的format属性中设置显示格式的时候月份要用“MM”而不是我们通常认为的“mm”。
2.3 StrToDate函数
function StrToDate(const S: string): TDateTime;
这个函数可以看成是DateToStr的逆函数,作用就是把一个字符串转换为TDateTime,参数S必须包括2个或3个数字,用DateSeparator所定义的分隔符分隔,年月日的顺序和格式遵从ShortDateFormat。如果输入的参数不符合日期类型的规定系统会触发EConvertError例外。
2.4 DateTimeToStr函数
function DateTimeToStr(DateTime: TDateTime): string;
把TDateTime转换为字符串,日期格式遵从ShortDateFormat,时间格式遵从LongTimeFormat,如果TDateTime的小数部分是0的话,那么返回的字符串中将没有时间部分。
2.5 StrToDateTime函数
function StrToDateTime(const S: string): TDateTime;
这个函数可以看作是DateTimeToStr函数的逆函数,和StrToDate差不多。
2.6 DateTimeToString过程
procedure DateTimeToString(var Result: string; const Format: string; DateTime: TDateTime);
这个过程的作用和DateTimeToStr和DateToStr一样,特别的地方是可以指定TDateTime的格式,这样就可以得到我们指定格式的日期型字符串了。
2.7 Now,Time,StrToTime等等就不详细介绍了,都可以在帮助里得到相关信息,如果有不明白的地方就写代码测试一下。

二、怎样使用帮助
delphi的帮助不如PowerBuilder的帮助那么详细,并且外面的书也都没有什么很好的详尽讲解
以Delphi6中的DateTimeToStr函数为例子,在代码中我们选中DateTimeToStr,然后按F1就可以得到如下的帮助:【】里是说明
VCL Reference【相关的vcl refrence帮助】
DateTimeToStr function【一般在帮助主题的索引里看到的就是这个】

See also Example【see also链接着相关的内容,Example链接着范例代码】

Converts a TDateTime value to a string.【功能说明,把TDateTime类型转换为String类型】

Unit【所属单元】

SysUtils【说明属于SysUtils】

Category【所属类别】

date/time routines【说明属于date/time例程,并且链接着date/time相关的例程——函数和过程】

function DateTimeToStr(DateTime: TDateTime): string;【函数声名的形式】

Description【描述,详细的说明】

DateTimeToString converts the TDateTime value given by DateTime using the format given by the ShortDateFormat global variable, followed by the time using the format given by the LongTimeFormat global variable. The time is not displayed if the fractional part of the DateTime value is zero. 【DateTimeToStr转换通过DateTime参数传入的TDateTime类型的值为字符串,根据ShortDateFormat全局变量所给定的日期格式,遵循LongTimeFormat所给定的时间格式。如果DateTime的小数部分为零的话返回的字符串中将没有时间部分】

To change how the string is formatted, change ShortDateFormat and LongTimeFormat global date time formatting variables.【要改变字符串的格式,可以通过改变ShortDateFormat和LongTimeFormat全局日期时间格式变量来实现】

三、和数据库中的日期字段
  有人询问怎样在SQL中设定Date/DateTime类型的查询值,这和数据库本身有关。不同的数据库对日期类型的字段一般都有对应的函数和格式,不过应该都支持ANSI标准——谁叫数据库厂商都是美国的。比如,我在Oracle8中要查询日期型字段我一般使用【Select * From LoginTable Where LoginTime >= To_Date('2003.03.01 00:00:00','yyyy.mm.dd hh24:mi:ss')】,MSSQLServer2000中文版的写法是【Select * From LoginTable Where LoginTime >= '2003-03-01 00:00:00'】,SQLServer的联机帮助中讲得比较详细,而且用起来似乎也比较方便,不过Oracle可以自己设定日期格式。
  说句题外话,查询的时候,很多人为了方便往往把日期型的字段用函数转换成字符串,然后和字符串式的日期来进行比较,例如:【Select * From LoginTable Where To_Char(LoginTime,'yyyy.mm.dd hh24:mi:ss') >= '2003.03.01 00:00:00'】,这样的写法语法上没有问题,但是性能上存在很大的隐患。因为,数据库执行这样的查询是要对每一条记录的loginTime字段进行计算然后再比较,如果记录数多,会很慢。

delphi中关于时间差的实例的更多相关文章

  1. Delphi中Tlist实例

    http://blog.163.com/jiandande3218@126/blog/static/74728469201132721428194/ Delphi中Tlist实例 2011-04-27 ...

  2. Delphi中使用比较少的一些语法

    本文是为了加强记忆而写,这里写的大多数内容都是在编程的日常工作中使用频率不高的东西,但是又十分重要. ---Murphy 1,构造和析构函数: a,构造函数: 一般基于TComponent组件的派生类 ...

  3. Delphi中线程类TThread实现多线程编程2---事件、临界区、Synchronize、WaitFor……

    接着上文介绍TThread. 现在开始说明 Synchronize和WaitFor 但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event) 事件(Event)与De ...

  4. Delphi中的接口和抽象类

    参考:http://blog.csdn.net/xinzheng_wang/article/details/6058643 接口:Interface Delphi中接口中的关键字Interface,但 ...

  5. Delphi中DLL的创建和使用

    参考:http://blog.csdn.net/ninetowns2008/article/details/6311663 结合这篇博客:http://www.cnblogs.com/xumenger ...

  6. 主窗体里面打开子窗体&&打印饼图《Delphi 6数据库开发典型实例》--图表的绘制

    \Delphi 6数据库开发典型实例\图表的绘制 1.在主窗体里面打开子窗体:ShowForm(Tfrm_Print); procedure Tfrm_Main.ShowForm(AFormClass ...

  7. Delphi ActiveX Form的使用实例

    Delphi ActiveX Form的使用实例 By knityster 1. ActiveX控件简介 ActiveX控件也就是一般所说的OCX控件,它是ActiveX技术的一部分. ActiveX ...

  8. 用SPCOMM 在 Delphi中实现串口通讯 转

      用Delphi 实现串口通讯,常用的几种方法为:使用控件如MSCOMM和SPCOMM,使用API函数或者在Delphi 中调用其它串口通讯程序.利用API编写串口通信程序较为复杂,需要掌握大量通信 ...

  9. delphi 中几种多线程操作方式

    在了解多线程之前我们先了解一下进程和线程的关系 一个程序至少有一个主进程,一个进程至少有一个线程. 为了保证线程的安全性请大家看看下面介绍 Delphi多线程同步的一些处理方案大家可以参考:http: ...

随机推荐

  1. JWT的使用流程

    JWT的实现原理 一篇文章告诉你JWT的实现原理 发布于 3 个月前 作者 axetroy 3097 次浏览 来自 分享 在使用 JWT 的时候,有没有想过,为什么我们需要 JWT?以及它的工作原理是 ...

  2. COMP9021——6.3

    有关yield的用法简介以及图灵机 第一节课大体没有太大变化,前半节课为了给图灵机的讲解做铺垫引入了yield.数组.字符串和文件等都是一个可迭代的对象,但由于它们的所有数据都存储与内存中,对内存的消 ...

  3. R-barplot()

    barplot这个函数啊...坑...度娘的很多解决方案都不对,只好重新看回manual再做测试== 本文参考的是: https://stat.ethz.ch/R-manual/R-devel/lib ...

  4. sqli-labs less1 &&less3&&less4学习心得

    0x01.less1 id=1/ id=1 and 1=1结果正常 id=1 and 1=2结果正常,不合理 id=1'提示:

  5. OpenStack, kvm, qemu-kvm以及libvirt之关系

    OpenStack, kvm, qemu-kvm以及libvirt之关系: KVM是最底层的hypervisor,它是用来模拟CPU的运行,它缺少了对network和周边I/O的支持,所以我们是没法直 ...

  6. 最长回文子串——manacher

    最长回文子串--Manacher 算法 (原版的博主的代码都是用py写的,这里改成c++) c++ 算法 字符串处理 0. 问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 如果一 ...

  7. selenium2-元素管理方式及解析

    1.管理文件格式:yaml 2.Yaml里面的内容格式:   3.格式说明: baidu_input后面接上":",直接回车,然后空两格 type与value这两个key是固定 ...

  8. BZOJ 5334: [Tjoi2018]数学计算

    线段树裸题 难度在于认识到这个没法线性做 #include<cstdio> using namespace std; int n,mod,tr[400005]; void insert(i ...

  9. JAVA-基础(一)

    1.一个变量可以声明为final,这样做的目的是阻止它的内容被修改.这意味着在声明final 变量的时候,你必须初始化它(在这种用法上,final类似于C/C++中的const). 例如: final ...

  10. xml了解

    Xml简介 ➢XML指可扩展标记语言(Extensible Markup Language) ➢XML被设计用于结构化.存储和传输数据 ➢XML是一种标记语言,很类似于HTML ➢XML没有像HTML ...