Как рассчитать текущую дату как количество миллисекунд с 1601-01-01 с помощью PowerShell

Как рассчитать количество миллисекунд с 1601-01-01 на сегодняшнюю дату с помощью сценария Windows PowerShell? Мне нужно это для создания правильных запросов LDAP.


person Max    schedule 29.05.2013    source источник


Ответы (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
person vonPryz    schedule 29.05.2013
comment
10 миллионов тиков в секунду. - person Garric; 16.12.2020
comment
В тиках PS на 1 января 1601 00:00:00 = 504911232000000000 - person Garric; 16.12.2020
comment
В тиках PS на 1 января 0001 00:00:00 = 0 - person Garric; 16.12.2020

Полностью согласен с ответом @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)
person JPBlanc    schedule 29.05.2013

Будет правильно:

(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
person Garric    schedule 15.12.2020