Могу ли я получить правильную дату, смешивая Get-Date и [DateTime]::FromFileTime

Совет на http://powershell.com/cs/blogs/tips/archive/2014/04/10/converting-ticks-into-real-date.aspx показывает, как конвертировать тики в дату. Значение года получается неверным, когда вы возвращаете Get-Date().Tics обратно, используя [DateTime]::FromFileTime. Я выяснил проблему с UTC, но год все еще неверен. Сообщение в Powershell: get-date & [datetime]::FromFileTime возвращает различные значения, показавшие начальную проблему. Похоже, что в двух расчетах используется другое базовое значение, что делает расчет 3600 лет выключенным. Что здесь происходит?

PS> [DateTime]::FromFileTime((Get-Date -Date '2014-04-01 18:22:12').Ticks)
Tuesday, April 01, 3614 11:22:12 AM
PS> [DateTime]::FromFileTime(((Get-Date -Date '2014-04-01 18:22:12').ToUniversalTime()).Ticks)
Tuesday, April 01, 3614 6:22:12 PM
PS> [DateTime]::FromFileTimeUTC(((Get-Date -Date '2014-04-01 18:22:12')).Ticks)
Tuesday, April 01, 3614 6:22:12 PM

2 ответа

Решение

DateTime.Ticks а также FileTime две разные единицы.

DateTime.Ticks - число 100 наносекунд с 1 января 0001 года.

Значение этого свойства представляет количество интервалов в 100 наносекунд, прошедших с 12:00:00 до полуночи 1 января 0001 года, которое представляет DateTime.MinValue.

FileTime, однако, являются тиками с 17-го века (1 января 1601 года) по времени UTC.

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

Таким образом, ваш расчет всегда будет отсутствовать на 1600 лет +/- несколько часов.

(Get-Date -Date '2014-04-01 18:22:12').Ticks дает вам общее количество тиков (не с 1601 года), но [DateTime]::FromFiletimeUTC(X) ожидает, что число X будет с 1601 г. так, добавляя его.

Упрощенная:

    (Get-Date '2014-01-01').ticks = 635241312000000000
    (Get-Date '1601-01-01').ticks = 504911232000000000 <--- not ZERO
    [Datetime]::FromFileTimeUtc(0) = Monday, January 1, 1601 12:00:00 AM
Другие вопросы по тегам