2012-02-09 10 views
10

मैं के रूप में खिड़कियों गुण में प्रकट होता है के रूप में ही बनाया गया, को एक्सेस किया गया और संशोधित दिनांक प्राप्त करने के लिए कोशिश कर रहा हूँ:फ़ाइल कैसे बनाया गया, एक्सेस किया गया और संशोधित दिनांक विंडोज गुणों के समान ही है?

File Properties

लेकिन लग रहा है बार 30 मिनट के बाहर लगातार कर रहे हैं:

File Properties Delphi

मान लें कि इसमें टाइमज़ोन/डेलाइट बचत के साथ कुछ करना हो सकता है लेकिन समाधान खोजने में असमर्थ रहे हैं। समयक्षेत्र पूर्वाग्रह और समायोजित करने और सहित विभिन्न तरीकों को देख: How to get create/last modified dates of a file in Delphi?

वर्तमान कोड:

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)); 
... 

भी मदद की सराहना

धन्यवाद पॉल

+0

आपने हमें यह नहीं बताया कि आप वर्तमान में जानकारी कैसे प्राप्त कर रहे हैं। –

+0

डेविड - वर्तमान कोड जोड़ दिया लेकिन –

+2

ठीक है, तो आप यूटीसी से स्थानीय समय में रूपांतरण खो रहे हैं। मेरा जवाब और कोबिक का शो यह कैसे करना है। –

उत्तर

24

मुझे यकीन नहीं है कि आपके वर्तमान कोड में क्या गड़बड़ है, लेकिन मेरा मानना ​​है कि यह कोड मानक विंडोज एपीआई कॉल का उपयोग करके आपको जो चाहिए, वह करेगा।

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

आप होना चाहिए पर देख रहे हैं की कोशिश की है एक यूटीसी दिनांक समय मान को स्थानीय दिनांक समय में बदलने के लिए नीचे दिए गए कोड का उपयोग करने में सक्षम:

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; 

आपकी छवियों से जुड़ाव आपका ऑफ़सेट वास्तव में 10 घंटे और 30 मिनट है। क्या आप दक्षिण ऑस्ट्रेलिया में स्थित हैं?

+0

हेनरिक, हां एडीलेड दक्षिण ऑस्ट्रेलिया। यह विंडोज़ गुणों में हर समय कनवर्ट करने में सक्षम था। अपना समय प्रशंसा करें –

+2

आप उसे मिला है! :-) एक और तरीका 'FileTimeToLocalFileTime' है – OnTheFly

संबंधित मुद्दे