• 时间TDateTime相当于是Double,即双精度数64位,终于查到它用11位表示e,53位表示精度(整数小数一起),最前面一位表示正负


    http://docwiki.embarcadero.com/RADStudio/Seattle/en/Internal_Data_Formats

    关于Double的RTL函数,好像就一个:TryStrToFloat

    function TryStrToFloat(const S: string; out Value: Double): Boolean; overload;
    function TryStrToFloat(const S: string; out Value: Double; const FormatSettings: TFormatSettings): Boolean; overload;

    好在还能按照指定格式转换,运气不错。

    --------------------------------------------------------------------------------------------------------------------------

    顺便复习一下absolute关键字的用法:

    function DoubleToHex(const d: DOUBLE): string;
    var
        Overlay: array[1..2] of LongInt absolute d;
    begin
        try
            // "Little Endian" order
            RESULT := IntToHex(Overlay[2], 8) + IntToHex(Overlay[1], 8);
        except
        end;
    end 

    其中API函数FileTimeToSystemTime取来的时间,需要用Delphi提供的SystemTimeToDateTime函数做转换,才能得到Delphi自定义的TDateTime数据(Delphi中的日期则是使用双精度类型进行存储的,整数部分表示距“1899-12-30”的天数,小数部分表示小时。如“2.75”这个数值则表示“1900-1-1 6:00PM”,“-1.25”则表示“1899-12-29 6:00 AM”)

    function GetFileTimesUTC(const FileName: string): TDateTime;
    var
        SystemTime: TSystemTime;
        FindData: WIN32_FIND_DATAW;
        FindHandle: THandle;
        fn: string;
    begin
        Result := 0;
        FindHandle := INVALID_HANDLE_VALUE;
    
        FindHandle := FindFirstFileW(strCheminToUnicode(fn), FindData);
        if FindHandle <> INVALID_HANDLE_VALUE then
            if FileTimeToSystemTime(FindData.ftLastWriteTime, SystemTime) then
            begin
            Result := SystemTimeToDateTime(SystemTime);
            end;
        if FindHandle <> INVALID_HANDLE_VALUE then
            Windows.FindClose(FindHandle);
    end;

    比如这个数:

    2014-07-07, 09:31:25 ,经过调试,在Delphi里的TDateTime值是:41827.355157 (小数点前是天数,小数点后是小时)。用例子验证一下天数:

    procedure TForm1.Button2Click(Sender: TObject);
    var
        dd: integer;
        hh: Int64; 
        mydate : TDateTime;
        myreal : Double;
    begin
        dd := 41827;
        mydate := EncodeDate(1899, 12, 30);
        mydate := mydate + dd;
        ShowMessage(FormatDateTime('yyyy-mm-dd', mydate));
    end;
  • 相关阅读:
    成都磨子桥技工学校 / 数据结构 Challenge 4
    圆桌问题(网络流24题)
    试题库问题(网络流24题)
    [AHOI2005]航线规划
    [AMPPZ2014]The Prices
    方格取数(网络流24题)
    太空飞行计划问题(网络流24题)
    Linux 学习3
    Linux 学习2
    Linux 学习1
  • 原文地址:https://www.cnblogs.com/findumars/p/4996482.html
Copyright © 2020-2023  润新知