zoukankan      html  css  js  c++  java
  • 时间与相关类型(1) TDateTime 与 Double

    //相关函数:
    SysUtils.FloatToDateTime();
    SysUtils.TryFloatToDateTime();
    

    在 System 单元定义有: TDateTime = type Double;

    看来 TDateTime 是一个 8 字节 64 位数据, 不过是 Double 的别名.


    {测试: TDateTime 就是一个 Double}
    var
      t: TDateTime;
      d: Double;
      s: string;
    begin
      t := EncodeDateTime(2009, 5, 22, 11, 22, 33, 999);
    
      {强制转换}
      d := Double(t);
      ShowMessage(FloatToStr(d)); //39955.4740046181
    
      {隐式转换}
      d := t;
      ShowMessage(FloatToStr(d)); //39955.4740046181
    
      {不必转换}
      ShowMessage(FloatToStr(t)); //39955.4740046181
    
      {直接把一个 Double 当作 TDateTime 看待}
      s := FormatDateTime('yyyy-m-d h:m:s:z', 39955.4740046181);
      ShowMessage(s);             //2009-5-22 11:22:33:999
    end;
    

    不会是任何一个 Double 都会转换成一个合法的时间, SysUtils 单元给出了最小与最大时间的常数:
    const
      MinDateTime: TDateTime = -657434.0;      { 01/01/0100 12:00:00.000 AM }
      MaxDateTime: TDateTime =  2958465.99999; { 12/31/9999 11:59:59.999 PM }
    

    保险起见, 应该通过: FloatToDateTime(); 或 TryFloatToDateTime(); 把一个数转换到 TDateTime;
    反向转换就没必要用函数了.
    {使用 TryFloatToDateTime}
    var
      t: TDateTime;
      d: Double;
    begin
      d := 0;
      if TryFloatToDateTime(d, t) then
        ShowMessage(DateTimeToStr(t)); //1899-12-30
    end;
    
    {使用 FloatToDateTime; 转换失败或遇到非法时间时会抛出异常}
    var
      t: TDateTime;
      d: Double;
    begin
      d := 0;
      t := FloatToDateTime(d);
      ShowMessage(DateTimeToStr(t)); //1899-12-30
    end;
    
    {当时间是 1899年12月30日 0时0分0秒 0毫秒时, TDateTime 对应的时间值是 0}
    var
      d: Double;
      t: TDateTime;
    begin
      t := StrToDateTime('1899-12-30 0:0:0:0');
      d := Double(t);
      ShowMessage(FloatToStr(d)); //0
    end;
    
  • 相关阅读:
    CodeForces 156B Suspects(枚举)
    CodeForces 156A Message(暴力)
    CodeForces 157B Trace
    CodeForces 157A Game Outcome
    HDU 3578 Greedy Tino(双塔DP)
    POJ 2609 Ferry Loading(双塔DP)
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛十六进制转换成十进制
  • 原文地址:https://www.cnblogs.com/del/p/1486876.html
Copyright © 2011-2022 走看看