2012-02-09 25 views
10

tôi đang cố gắng để có được tạo, ngày truy cập và thay đổi giống như xuất hiện trong cửa sổ thuộc tính như trong:Làm cách nào để có các ngày Tạo Tệp, Truy cập và Sửa đổi giống như các thuộc tính windows?

File Properties

Nhưng đang tìm kiếm thời gian được tính liên tục trong 30 phút ra:

File Properties Delphi

Tin tưởng rằng nó có thể có liên quan đến tiết kiệm múi giờ/ánh sáng ban ngày nhưng không thể tìm được giải pháp. Đã cố gắng tìm kiếm tại địa chỉ: TimeZone Bias và điều chỉnh và xem xét phương pháp khác nhau bao gồm: How to get create/last modified dates of a file in Delphi?

đang hiện tại:

var 
MyFd TWin32FindData; 
FName: string; 
MyTime: TFileTime; 
MySysTime: TSystemTime; 
myDate, CreateTime, AccessTime, ModTime: TDateTime; 
Begin 
... 
FindFirstFile(PChar(FName), MyFd); 
MyTime:=MyFd.ftCreationTime; 
FileTimeToSystemTime(MyTime, MySysTime); 
myDate := EncodeDateTime(MySysTime.wYear, MySysTime.wMonth, MySysTime.wDay, MySysTime.wHour, 
MySysTime.wMinute, MySysTime.wSecond, MySysTime.wMilliseconds); 
Memo1.Lines.Add('Created: '+ FormatDateTime('dddd, d mmmm yyyy, hh:mm:ss ampm', MyDate)); 
... 

Bất kỳ giúp đánh giá cao

Cảm ơn Paul

+0

Bạn không cho chúng tôi biết cách bạn hiện đang nhận thông tin. –

+0

David - thêm mã hiện tại nhưng đã thử nhiều phương thức –

+2

OK, bạn đang thiếu chuyển đổi từ UTC sang giờ địa phương. Câu trả lời của tôi và Kobik cũng cho thấy cách làm điều đó. –

Trả lời

24

Tôi không chắc chắn có gì sai với mã hiện tại của bạn, nhưng tôi tin rằng mã này sẽ làm những gì bạn cần, bằng cách sử dụng các cuộc gọi API chuẩn của Windows.

procedure TMyForm.ReportFileTimes(const FileName: string); 

    procedure ReportTime(const Name: string; const FileTime: TFileTime); 
    var 
    SystemTime, LocalTime: TSystemTime; 
    begin 
    if not FileTimeToSystemTime(FileTime, SystemTime) then 
     RaiseLastOSError; 
    if not SystemTimeToTzSpecificLocalTime(nil, SystemTime, LocalTime) then 
     RaiseLastOSError; 
    Memo1.Lines.Add(Name + ': ' + DateTimeToStr(SystemTimeToDateTime(LocalTime))); 
    end; 

var 
    fad: TWin32FileAttributeData; 

begin 
    if not GetFileAttributesEx(PChar(FileName), GetFileExInfoStandard, @fad) then 
    RaiseLastOSError; 
    Memo1.Clear; 
    Memo1.Lines.Add(FileName); 
    ReportTime('Created', fad.ftCreationTime); 
    ReportTime('Modified', fad.ftLastWriteTime); 
    ReportTime('Accessed', fad.ftLastAccessTime); 
end; 

procedure TMyForm.Button1Click(Sender: TObject); 
begin 
    ReportFileTimes(Edit1.Text); 
end; 
3

Bạn nên có thể sử dụng mã bên dưới để chuyển đổi giá trị ngày giờ UTC thành câu chuyện ngày giờ địa phương:

uses 
    Windows; 

function UTCTimeToLocalTime(const aValue: TDateTime): TDateTime; 
var 
    lBias: Integer; 
    lTZI: TTimeZoneInformation; 
begin 
    lBias := 0; 
    case GetTimeZoneInformation(lTZI) of 
    TIME_ZONE_ID_UNKNOWN: 
     lBias := lTZI.Bias; 
    TIME_ZONE_ID_DAYLIGHT: 
     lBias := lTZI.Bias + lTZI.DaylightBias; 
    TIME_ZONE_ID_STANDARD: 
     lBias := lTZI.Bias + lTZI.StandardBias; 
    end; 
    // UTC = local time + bias 
    // bias is in number of minutes, TDateTime is in days 
    Result := aValue - (lBias/(24 * 60)); 
end; 

Đánh giá từ hình ảnh bù đắp của bạn thực sự là 10 giờ 30 phút. Bạn có ở Nam Úc không?

+0

Henrick, Có Adelaide South Australia. Điều này đã có thể chuyển đổi tất cả các lần để giống như trong các thuộc tính cửa sổ. Đánh giá cao thời gian của bạn –

+2

Bạn đã có anh ấy! :-) Một cách khác là 'FileTimeToLocalFileTime' – OnTheFly

Các vấn đề liên quan