如何使用PowerShell将当前日期计算为1601-01-01之后的毫秒数

如何使用PowerShell将当前日期计算为1601-01-01之后的毫秒数,powershell,ldap-query,Powershell,Ldap Query,如何使用windows PowerShell脚本计算自1601-01-01以来当前日期的毫秒数? 我需要它来构建正确的LDAP查询。一个DateTime结构包含方法ToFileTime。根据, Windows文件时间是一个64位的值,表示 从午夜12:00开始的100纳秒间隔, 公元1601年1月1日,协调世界时(UTC) 因此,从ns(10e-9)到ms(10e-3)是简单的算法。请注意,计数器计数100 ns块,而不是1 ns块。该值存储为Int64,因此不需要进行类型转换。这样, PS C

如何使用windows PowerShell脚本计算自1601-01-01以来当前日期的毫秒数?
我需要它来构建正确的LDAP查询。

一个
DateTime
结构包含方法
ToFileTime
。根据,

Windows文件时间是一个64位的值,表示 从午夜12:00开始的100纳秒间隔, 公元1601年1月1日,协调世界时(UTC)

因此,从ns(10e-9)到ms(10e-3)是简单的算法。请注意,计数器计数100 ns块,而不是1 ns块。该值存储为Int64,因此不需要进行类型转换。这样,

PS C:\> (Get-Date).ToFileTime()
130142949169114886
PS C:\> (Get-Date).ToFileTime().GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int64                                    System.ValueType

完全同意@vonPryz的回答。为了好玩,您可以在Powershell
System.DateTime
tick
属性中找到100纳秒的数值。但是这个勾号不是来自“01/01/1600”,而是来自([datetime]::MinValue)“01/01/0001”

尝试:

这将是正确的:

(Get-Date).ToFileTime()/10000
如果上面的简单解决方案(Get Date).ToFileTime()给出了10000次的错误,我们甚至会想到会发生什么

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

每秒1000万个滴答声。1601年1月1日的PS滴答声00:00:00=50491123200000000年1月1日的PS滴答声0001 00:00:00=0
$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