无法绑定 New-TimeSpan -Start。值不是日期时间

New-TimeSpan -Start cannot be bound. Value is no DateTime

我必须以秒为单位了解 DateTime 和 Sysdate 之间的差异。

此代码在几个月内运行良好。由于我将其放入函数中,因此出现错误:

New-TimeSpan : The parameter "Start" cannot be bound. The Value "06/14/2016 09:50:42" cannot get converted into "System.DateTime". Error : "String is no valid DateTime."

(因为控制台输出是德语,所以用自己的话翻译)

function _CalcRunningTime
{
  param( [String] $p_sDatetime )
  $sSYSDATE    = Get-Date -format "dd.MM.yyyy HH:mm:ss"                
  $oCulture    = New-Object System.Globalization.CultureInfo("de-DE")
  $p_sDatetime = [DateTime]::ParseExact( $p_sDatetime, "dd.MM.yyyy HH:mm:ss", $oCulture )
  $sSYSDATE    = [DateTime]::ParseExact( $sSYSDATE, "dd.MM.yyyy HH:mm:ss", $oCulture )
  $oTIMESPAN   = New-TimeSpan –Start $p_sDatetime –End $sSYSDATE
  $iSeconds    = ($oTIMESPAN.Hours * 3600) + ($oTIMESPAN.Minutes * 60) + $oTIMESPAN.Seconds

  Return $iSeconds
}

$p_sDatetime的输入格式例如06.14.2016 09:50:42ParseExact()后格式如上所示。

不要重复使用变量或参数,也不要将 DateTime 值转换为字符串并将它们解析回 DateTime 值。此外,计算两个 DateTime 值之间的差异将为您提供一个 Timespan 对象(它已经为您提供了一个现成的方法来获取总秒数)。无需特意使用 cmdlet 或手动计算秒数。使用 return 关键字也是可选的。

将您的函数简化为如下所示:

function _CalcRunningTime {
  param( [String] $p_sDatetime )

  $culture    = New-Object System.Globalization.CultureInfo('de-DE')
  $parsedDate = [DateTime]::ParseExact($p_sDatetime, 'dd.MM.yyyy HH:mm:ss', $culture)

  ($parsedDate – (Get-Date)).TotalSeconds
}

如果您不需要秒的小数部分,请将秒数转换为整数:

[int]($parsedDate – (Get-Date)).TotalSeconds

至少现在这对我来说似乎工作得很好:

# ------------------ Func: _CalcRunningTime ------------------
function _CalcRunningTime
{
    param( [String] $p_sDatetime )

    $sSYSDATE   = Get-Date -format "dd.MM.yyyy HH:mm:ss"
    $oTIMESPAN   = New-TimeSpan –Start $p_sDatetime –End $sSYSDATE

    Return $oTIMESPAN.TotalSeconds
}
# ------------------ Func: _CalcRunningTime ------------------