В .Net, как я могу конвертировать между SystemTime и FileTime? - PullRequest
0 голосов
/ 30 мая 2018

Согласно https://msdn.microsoft.com/en-us/library/windows/desktop/ms724290(v=vs.85).aspx, время файла - это 64-разрядное значение, представляющее число интервалов в 100 наносекунд, прошедших с 12:00 1 января 1601 года по всемирному координированному времени (UTC).

Для преобразования между SystemTime и FileTime можно использовать функции Windows API SystemTimeToFileTime и FileTimeToSystemTime.

Возможно, я что-то здесь упускаю, потому что не думаю, чточто это слишком редкая задача.Тем не менее, поиск SO для [.net] systemtimetofiletime дает в качестве результатов только один (недооцененный) ответ и без соответствующих вопросов.

Возможно, это просто недостаток знаний о правильной терминологии, и SystemTimeToFileTime называется чем-то совсем другимМир .Net.

В любом случае, вопрос в том, как правильно конвертировать между SystemTime и FileTime в .Net?

Ответы [ 2 ]

0 голосов
/ 15 августа 2018

Похоже, вы делаете это слишком сложно.В PowerShell через .NET вы бы делали это следующим образом:

PS C:\Users\luser> ([System.DateTime]"Jan 05,2018").ToFileTime()
131596092000000000

PS C:\Users\luser> ([System.DateTime]::FromFileTime('131596092000000000'))

Friday, January 5, 2018 12:00:00 AM

System.Datetime имеет CTOR, который принимает практически любой тип формата, который вы хотите предоставить в качестве даты и времени, а затем используете ToFileTime () метод для получения значения int64.

Аналогично, класс Datetime имеет метод для преобразования значений int64 в DateTime с использованием метода FromFileTime ().

или я неправильно понимаю проблему?

0 голосов
/ 30 мая 2018

Объявите функцию PInvoke и вызовите ее.

//Taken from http://www.codeproject.com/csharp/timezoneconversions.asp?print=true
private static DateTime SystemTimeToDateTime(ref SYSTEMTIME st)
{
        FILETIME ft = new FILETIME();
        SystemTimeToFileTime(ref st, out ft);
        DateTime dt = new DateTime((((long)ft.dwHighDateTime) << 32) | (uint)ft.dwLowDateTime);
        return dt;
}

Лично я ищу в .NET Framework декомпилятор, такой как Reflector, в таких случаях для существующих случаев использования.Часто Microsoft уже внутренне назвала API, который мне нужен.Вероятно, их код PInvoke будет правильным и готов к копированию.

...