2016-06-14 61 views
0

我必須在幾秒鐘內得到DateTime和Sysdate之間的差異。New-TimeSpan -Start無法綁定。值爲no DateTime

此代碼運行良好數月。因爲我把它變成一個功能,我發現了錯誤:

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."

(翻譯成自己的話,因爲控制檯輸出是德國)的$p_sDatetime

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 
} 

輸入格式是例如06.14.2016 09:50:42ParseExact()之後的格式如上所示。

回答

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 
+0

函數TotalSeconds對我來說不是很高。我收到一個錯誤:我的func的返回值無法轉換爲System.Int32。 – Yaerox

+1

@Mike無法重現。屬性'TotalSeconds'應該返回一個double,它可以轉換爲整數。 –

+0

Sry,我再也無法再現它了......對我來說,現在它也可以工作......我想我在任何地方都遇到了另一個問題,而且我混淆了一切。謝謝你,先生。 – Yaerox

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