New-TimeSpan -Start无法绑定。值不是DateTime

时间:2016-06-14 11:35:55

标签: powershell datetime powershell-v2.0

我必须在几秒钟内得到DateTime和Sysdate之间的区别。

这段代码运作良好数月。因为我把它放到一个函数中,我得到错误:

  

New-TimeSpan:参数"开始"无法约束。 The Value" 06/14/2016 09:50:42"无法转换为" System.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:42。在ParseExact()之后,格式如上所示。

2 个答案:

答案 0 :(得分:2)

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

将oyur函数简化为:

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

答案 1 :(得分:0)

至少目前看来这对我来说还不错:

# ------------------ 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 ------------------