Как рассчитать количество миллисекунд с 1601-01-01 на сегодняшнюю дату с помощью сценария Windows PowerShell? Мне нужно это для создания правильных запросов LDAP.
Как рассчитать текущую дату как количество миллисекунд с 1601-01-01 с помощью PowerShell
Ответы (3)
Структура DateTime
содержит метод ToFileTime
. Согласно документации,
Время файла Windows — это 64-разрядное значение, представляющее количество 100-наносекундных интервалов, прошедших с полуночи 1 января 1601 года нашей эры (н.э.) по всемирному координированному времени (UTC).
Таким образом, переход от ns (10e-9) к ms (10e-3) — это простая арифметика. Только учтите, что счетчик считает блоки по 100 нс, а не блоки по 1 нс. Значение сохраняется как Int64, поэтому преобразование типов не требуется. Вот так,
PS C:\> (Get-Date).ToFileTime()
130142949169114886
PS C:\> (Get-Date).ToFileTime().GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Int64 System.ValueType
Полностью согласен с ответом @vonPryz. Просто для удовольствия Вы можете найти число 100-наносекунд в свойстве tick
Powershell System.DateTime
. Но этот тик не от "01/01/1600", а от ([datetime]::MinValue) "01/01/0001".
пытаться :
$a = ([datetime]::Now).Ticks - ([datetime]("01/01/1600 12:00")).Ticks
[datetime]::FromFileTimeUtc($a)
Будет правильно:
(Get-Date).ToFileTime()/10000
Страшно даже подумать, что с нами будет, если приведенное выше простое решение (Get-Date).ToFileTime() выдаст ошибку в 10 000 раз
4205233 года. Это ужасно
$a = ([datetime]::Now).Ticks
$secTimer=1
Start-Sleep -Seconds $secTimer
$b = ([datetime]::Now).Ticks
$c=$b-$a
'ticks={0} == {1} sec and {2} ticks' -f $c,[int](Get-Date $c -Format "ss"),[int](Get-Date $c -Format "fffffff")
$TicksPerSec = $c/$secTimer
'ticks per second = {0}' -f ($c/$secTimer)
echo "`n"
$Year=1601;$Month=1;$date=1;$hour=0;$minutes=0;$Seconds=0;$mSeconds=0;
$Ticks1601 = New-Object DateTime $Year, $Month, $date, $hour, $minutes, $Seconds, $mSeconds
'Ticks on Jan 1 1601 00:00:00 = {0}' -f $Ticks1601.Ticks
$TicksNow = ([datetime]::Now).Ticks
$time=$TicksNow-$Ticks1601
'after Jan 1 1601 00:00:00'
' milliseconds {0}' -f ($time.Ticks/$TicksPerSec*1000)
$seconds=$time.Ticks/$TicksPerSec
' seconds = {0}' -f $seconds
$min=$seconds/60
' minutes = {0}' -f $min
$hours=$min/60
' hours = {0}' -f $hours
$days=$hours/24
' days = {0}' -f $days
$years=$days/364.75
' years = {0}' -f $years
echo "`nand`n"
$ms=(Get-Date).ToFileTime()
'simple ToFileTime() after Jan 1 1601 00:00:00'
' milliseconds {0}' -f $ms
$years=$ms/1000/60/60/24/364.75
' years = {0}' -f $years
'???'
echo "`n"
$Year=1;$Month=1;$date=1;$hour=0;$minutes=0;$Seconds=0;$mSeconds=0;
$time = New-Object DateTime $Year, $Month, $date, $hour, $minutes, $Seconds, $mSeconds
'Ticks on Jan 1 0001 00:00:00 = {0}' -f $time.Ticks