Преобразование ulong FILETIME в datetime

Моя программа получает время файла в формате ulong, и мне нужно преобразовать его в формат DateTime. Итак, вот функция, которую я написал.

public static DateTime fileTimeToDateTime(ulong fileTime)
{
    long temp = (long)fileTime;
    DateTime dt1 = DateTime.FromFileTime(temp);
    return dt1;
}

Но для файлового времени 2213360000 функция возвращает 1/1/1601 12:00:00 AM, но правильным должно быть 4/22/2009 3:28:29 PM Итак, я использовал эту веб-страницу для преобразования файлового времени в удобочитаемое время, и это дает мне правильное значение. Значит, с моей функцией что-то не так. Затем я конвертирую правильную дату, используя этот код мира.

string windowsTime = "4/22/2009 3:28:29 PM";
DateTime time = DateTime.Parse(windowsTime);
long ft = time.ToFileTime();

Итак, здесь вывод ft равен 128848589090000000, и это не то время файла, которое я получил (2213360000). Значит, что-то не так с тем, как я думаю. Есть идеи?


person Nayana Adassuriya    schedule 10.08.2014    source источник
comment
Просто предположение, но, вероятно, оно имеет меньшую точность, чем полное время файла. Умножение на некоторую степень 10, скорее всего, даст правильные результаты. Хотя было бы лучше, если бы вы могли проверить из источника, что именно подразумевается под значением, которое вы получаете.   -  person Matt Johnson-Pint    schedule 11.08.2014


Ответы (2)


FromFileTime ожидает вывод функции GetFileTime Windows -- структуры FILETIME. Он измеряет количество 100-наносекундных интервалов с 1 января 1601 года (UTC).

2213360000 интервалов в 100 наносекунд составляет около 0,02 секунды.

Теперь нужно обратить внимание на то, откуда вы получаете свой FILETIME, или если вы неправильно поняли, для чего предназначен этот метод. Можете ли вы обновить свой вопрос с кодом, подающим ваш метод?

person Cory Nelson    schedule 10.08.2014
comment
Время этого файла создается из DLL, предоставленной другой компанией. но вы видите, что веб-страница дает мне правильное время и дату. Так что есть способ получить его. - person Nayana Adassuriya; 10.08.2014
comment
Вам нужно будет увидеть, в каком формате этот веб-сайт читает его. Это определенно не FILETIME за 2009 год. - person Cory Nelson; 10.08.2014

Вы рассматривали возможность того, что конвертер из вашей ссылки сломан? Если вы уменьшите число на девять порядков, введите 2 вместо 2213360000 и подождите, пока оно преобразуется, оно все равно покажет 22 апреля 2009 года, всего на несколько минут меньше.

Число не похоже на FILETIME. Это может быть штамп unix, секунды с 1970 года. В этом случае дата будет 20 февраля 2040 года, 6:13 утра. К вашему сведению, в этих единицах сегодняшняя дата 1407649082.

person MirekE    schedule 10.08.2014