2015-03-26 2 views
2

Я открыл файл и использовал ToUniversalTime() и ToLocalTime() и выдавал разные времена. Однако, когда я использую ToFileTime() и ToFileTimeUtc(), я получаю тот же номер. Почему это?DateTime ToFileTime и ToFileTimeUtc имеют одинаковый вывод

DateTime creationTime = File.GetCreationTime(@"c:\windows\setupact.log"); 
Console.WriteLine("utc time: " + creationTime.ToUniversalTime()); 
Console.WriteLine("file time: " + creationTime.ToLocalTime()); 
Console.WriteLine("file: " + creationTime.ToFileTime()); 
Console.WriteLine("utc: " + creationTime.ToFileTimeUtc()); 

время выхода

UTC Время 8/22/2013 2:46:17 PM

файл: 8/22/2013 7:46:17 AM

файл: 130216563774628355

ГРИНВИЧ: 130216563774628355

Не должно быть файлов и utc?

+0

[Это вопрос] (http://www.pcreview.co.uk/threads/tofiletime-vs-tofiletimeutc-issues.2642152/), и документ ссылки предлагает более подробно –

+0

@DStanley, я не знаю, обновлена ​​ли документация для этой ссылки. Ссылка на GotDotNet нарушена, и поиск Google не открыл веб-страницу для GotDotNet. Кроме того, я тестировал числа, которые я получил против LocalFileTimeToFileTime() в C++. Это занимает местное время и конвертирует его в UTC. Выход для .ToFileTimeUtc совпадает с местным временем в C++, а не временем UTC – Aaron

+0

Каков ваш собственный часовой пояс? – albertjan

ответ

1

Там хорошая информация в существующих ответах, но позвольте мне попытаться прагматическое резюме:

Единственный раз, когда различие между System.DateTime.ToFileTime() и System.DateTime.ToFileTimeUtc() вопросами, когда .Kind свойства экземпляра равняется Unspecified, то есть, если это неясно независимо от того, является ли значение времени местным или UTC время.
Эта информация была фактически ответом Hans Passant, что он сам удалил.

Других слов: для System.DateTime экземплярам, ​​.Kind свойства равно либо Local или Utc (единственных других возможных значений), System.DateTime.ToFileTime() и System.DateTime.ToFileTimeUtc() ведут себя одинаково - это то, что ОП опытный, потому что его входное значение было от .KindLocal (вид, возвращаемый File.GetCreationTime()).

Обратите внимание, что соответствующий тип System.DateTimeOffset дизайн всегда несет полную информацию о часовом поясе, так что никогда не двусмысленность, поэтому этот тип только имеет метод .ToFileTime().

Как уже отмечалось, возвращение значение всегда представляет время UTC:

  • время файла значения по определению, неизменно представляют точку во времени в UTC.

  • Таким образом, как .ToFileTime(), так и .ToFileTimeUtc() создать момент времени, выраженный как счетчик 100 нс с полуночи 1 января 1601 г. UTC.

В дополнение к собственному примеру OP с одним где .ToFileTime() и .ToFileTimeUtc()сделать отличается результатом:

// Create a DateTime instance with .Kind equal to Unspecified; 
// use the earliest date that can be represented as a file time. 
DateTime dtUnspecified = DateTime.Parse("1601-01-01"); 

Console.WriteLine(
    dtUnspecified.ToFileTime() + "\n" + 
    dtUnspecified.ToFileTimeUtc() 
); 

Пример вывод в часовом поясе США Восточного:

180000000000 // 1601-01-01T05:00:00Z - 5 AM UTC 
0    // 1601-01-01T00:00:00Z - midnight UTC 
1

Из документов:

Время файла для Windows является 64-битное значение, которое представляет собой число 100-наносекундных интервалов, прошедших с 12:00 полуночи, 1 января 1601 AD (CE) Скоординированное универсальное время (UTC). Windows использует время файла для записи, когда приложение создает, получает доступ или записывает в файл.

Число наносекунд с 1 по 1601 UTC, не меняется независимо от того, в каком часовом поясе вы находитесь.

От источника .net framwork:

public long ToFileTime() { 
    // Treats the input as local if it is not specified 
    return ToUniversalTime().ToFileTimeUtc(); 
} 

public long ToFileTimeUtc() { 
    // Treats the input as universal if it is not specified 
    long ticks = ((InternalKind & LocalMask) != 0) ? ToUniversalTime().InternalTicks : this.InternalTicks; 
    ticks -= FileTimeOffset; 
    if (ticks < 0) { 
     throw new ArgumentOutOfRangeException(null, Environment.GetResourceString("ArgumentOutOfRange_FileTimeInvalid")); 
    } 
    return ticks; 
} 

Так что, когда вы используете ToFileTimeUtc и у вас есть энное DateTime это дает вам nanosecs с момента 1-1-1601, независимо от того, что часовой пояс не первоначально из , Который может в течение часа каждый год, если часовой пояс имеет DST, дает вам недействительное время.

0

Если вы посмотрите на ToFileTime() документации по MSDN, он говорит:

Время файла для Windows является 64-битное значение, которое представляет количество 100-наносекундных интервалов, прошедших с полуночи 12:00 , 1 января 1601 г. н.э. (CE) Скоординированное всеобщее время (UTC). Windows использует время файла для записи, когда приложение создает, получает доступ или записывает файл.

Все файлы раз хранились в UTC. Затем приложения, такие как Explorer, преобразуют время UTC в локальное время для целей показа.

Если вы посмотрите далее в раздел замечаний ToFileTime(), вы увидите раздел «Примечания к вызывающим». Это далее объясняет, как должны использоваться ToFileTime() и ToFileTimeUtc().

Смежные вопросы