powershell - 如何在 PowerShell 中将 Ticks 字符串转换为日期时间?

标签 powershell datetime

我从注册表中的 REG_QWORD 获取了刻度计数。然后,我显示刻度计数和数据类型,以验证我得到了预期的结果:

ticks = 638254472943517809 (data type = ulong)

到目前为止,一切都很好。但是当我尝试将其转换为 DateTime 时,我收到此错误消息:

Write-Error: Cannot convert value "638254472943517809" to type "System.DateTime". Error: "String '638254472943517809' was not recognized as a valid DateTime."

这是我的代码。注释掉的行是我在网上找到的各种技术,所有这些技术都失败并出现相同的错误:

     Write-Host "Ticks = $ticks (data type = $($ticks.getType()))"
#    $dateTime = [DateTime]$ticks
#    $dateTime = Get-Date -date $ticks
#    $dateTime = Get-Date [long]$ticks

PowerShell 验证 $ticks 变量是预期的 ulong(请参阅上面的第一个输出)。但是当我尝试在下一行中将其转换为 DateTime 时,PowerShell 表示 $ticks 变量是一个字符串

我做错了什么?

$PS版本表:

Name                           Value
----                           -----
PSVersion                      7.3.6
PSEdition                      Core
GitCommitId                    7.3.6
OS                             Microsoft Windows 10.0.19045
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

最佳答案

为了清楚地说明示例失败的原因,当转换发生时,PowerShell 会尝试许多不同的绑定(bind)来将源类型转换为目标类型,在您的例子中,为 ulong进入datetime 。最常见的绑定(bind)尝试发生在 type's constructor overloads 上。 ,其 Parse 方法(如果该类型已定义)且 explicit / implicit defined conversions ,同样,如果该类型已定义, IConvertible类型是否实现接口(interface)等等。请参阅Conversions doc了解更深入的细节。

错误:

...Error: "String '638254472943517809' was not recognized as a valid DateTime."

告诉我们 PowerShell 尝试使用 [datetime]::Parse method 进行转换它接受一个字符串作为输入,如果成功,将生成一个新的日期时间结构实例。因此,发生的情况是,您拥有的 ulong 首先被强制转换为 string,因此错误消息中的 String '638254472943517809'

通过一些帮助,您可以告诉 PowerShell 以 long ctor overload 为目标那么将 ulong 转换为 long 就没有问题了,一切都很好!

$ticks = [ulong] 638254472943517809
[datetime]::new($ticks)

Thursday, July 20, 2023 10:54:54 AM

如果在转换 datetime 之前转换 long,也会发生同样的情况:

[datetime] [long] [ulong] 638254472943517809

Thursday, July 20, 2023 10:54:54 AM

Get-Date 示例也是正确的,只是缺少括号,因此ulonglong 的转换发生在参数传递给 cmdlet 之前:

Get-Date ([long] $ticks)

注意: Windows PowerShell 5.1 及更早版本中不存在 [ulong] 类型加速器,在这些版本中您将使用 [uint64] 相反,或者您可以通过反射将 [ulong] 加速器添加到当前 session :

[powershell].Assembly.
    GetType('System.Management.Automation.TypeAccelerators')::Add('ulong', [UInt64])

关于powershell - 如何在 PowerShell 中将 Ticks 字符串转换为日期时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76732252/

相关文章:

python - import ed25519._ed25519 适用于 powershell 但不适用于 GAE

Powershell在远程计算机上使用命令行参数执行远程exe

Mysql如何计算从日期到日期之间的天数?

php - 如果提交后已经过了一个小时则更新记录

windows - 使用 Windows Control-C 剪贴板复制时如何保留制表符 `n` n?

.net - Powershell:从LDIF文件中提取模式之间的值

powershell - 是否有用于这些 AWS CLI 功能的 Azure 命令行界面

python - django 在一个字段中多个更新日期

wpf - DateTime 属性在更改时不会触发 PropertyChanged 事件

java - 减去毫秒不会给出预期的结果