Могу ли я получить правильную дату, смешивая 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