2016-06-14 8 views
0

Ich muss den Unterschied zwischen einem DateTime und Sysdate in Sekunden bekommen.New-TimeSpan -Start kann nicht gebunden werden. Wert ist kein DateTime

Dieser Code funktionierte für Monate gut. Da ich es in eine Funktion setzen, erhalte ich die Fehlermeldung:

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

(in eigenen Worten übersetzt, weil Konsolausgabe Deutsch ist)

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 
} 

Eingabeformat von $p_sDatetime ist z.B. 06.14.2016 09:50:42. Nach ParseExact() ist das Format wie oben gezeigt.

Antwort

2

Verwenden Sie keine Variablen oder Parameter und konvertieren Sie keine DateTime-Werte in Zeichenfolgen, und analysieren Sie sie erneut in DateTime-Werte. Wenn Sie die Differenz zwischen zwei DateTime Werten berechnen, erhalten Sie ein Timespan Objekt (das Ihnen bereits eine vorgefertigte Methode zur Verfügung stellt, um die Gesamtanzahl von Sekunden zu erhalten). Sie müssen sich nicht aus dem Weg gehen und ein Cmdlet verwenden oder die Anzahl der Sekunden manuell berechnen. Die Verwendung des Schlüsselwortes return ist ebenfalls optional.

Vereinfachen oyur Funktion etwas wie folgt aus:

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 
} 

Guss die Anzahl der Sekunden auf eine ganze Zahl, wenn Sie nicht wollen, Sekundenbruchteile:

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

Die Funktion TotalSeconds ist nicht highlightes für mich. Ich erhalte einen Fehler: Der Rückgabewert meiner Funktion kann nicht in System.Int32 konvertiert werden. – Yaerox

+1

@Mike Kann nicht reproduzieren. Die Eigenschaft 'TotalSeconds' sollte ein Double zurückgeben, das in Integer umgewandelt werden kann. –

+0

Sry, ich kann es nicht mehr reproduzieren ... für mich funktioniert das jetzt auch ... Ich glaube, ich hatte irgendwo ein anderes Problem und ich habe alles durcheinander gebracht. Danke dir, mein Herr. – Yaerox

0

zumindest für jetzt diese scheint für mich gut zu funktionieren:

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