apophis
Goto Top

Powershell: amerikanischen Zeitstempel in deutschen umwandeln

Hallo,

ich kann zwar Batch, aber kein Powershell. Nun habe ich das Problem, das ein Powershell-Script aus einer XML-Logdatei einen Datumsstempel ausliest und zu diesem Stempel eine Anzahl Sekunden hinzuaddieren soll.

$finjob = ($job.actualstarttime -as [datetime]).addseconds($job.elapsedtimeseconds)	#Adding total time to start time so we know when it ended

$finjob ist immer leer. Ich vermute, daß liegt daran, das Datumsstempel in $job.actualstarttime im amerikanischen Format, also z.B. "6/17/2017 4:30:05 PM", vorliegt und das der Befehl aber das deutsche Format sehen möchte.

Wäre der Zeitstempel ohne Uhrzeit, würde folgender Code (dank Tante Google) funktionieren:

$cultureUS = New-Object System.Globalization.CultureInfo("en-US")   
$strtime = $job.actualstarttime
$strtime=[datetime]::ParseExact($strtime,"M/dd/yyyy",$cultureUS)  
$finjob = ($strtime -as [datetime]).addseconds($job.elapsedtimeseconds)	

Wie muss nun die Uhrzeit da hinzu geflickt werden?

Danke

Gruß
Apophis

Content-Key: 341086

Url: https://administrator.de/contentid/341086

Printed on: April 24, 2024 at 04:04 o'clock

Member: AndreasHoster
AndreasHoster Jun 20, 2017 updated at 10:06:47 (UTC)
Goto Top
Vermutungen sind schön, meistens aber nicht zielführend.
Ich würde ja erstmal einzeln schauen, was da wirklich rauskommt.

Also:
Was ist das Ergebnis von
$job.actualstarttime 
Was ist das Ergebnis von
($job.actualstarttime -as [datetime])
Was ist das Ergebnis von
$job.elapsedtimeseconds

Danach kann man sich fundiert Gedanken darüber machen wo es schiefgeht.
Member: Apophis
Apophis Jun 20, 2017 at 11:00:10 (UTC)
Goto Top
Hallo,

Zitat von @AndreasHoster:

Vermutungen sind schön, meistens aber nicht zielführend.
Ich würde ja erstmal einzeln schauen, was da wirklich rauskommt.

Es gibt aber schon starke Vermutungen nahe der Gewissheit, zumal es nur mit den Datum ja geht - was beweist, daß dem Script da irgendwas quer liegt.

Also

> $job.actualstarttime 
> 

Ergebnis: 6/17/2017 4:30:05 PM

> ($job.actualstarttime -as [datetime])
> 

Nichts. Es wird nichts ausgegeben.

Was ist das Ergebnis von
> $job.elapsedtimeseconds
> 

Eine Zahl, z.B. 844

Wegen der Sicherheit habe ich im Code das -as [datetime] weggelassen, aber das Ergebnis ist das Gleiche. Soweit ist die Sache klar: wenn die Konvertierung in das Datumsfomat nichts zurückliefert, kann auch nichts dazu gerechnet werden. Nur der Vollständigkeit halber: das Script beschwert sich auch mit der passenden Fehlermeldung:

You cannot call a method on a null-valued expression.

Gruß
Apophis
Member: emeriks
Solution emeriks Jun 20, 2017 at 11:25:51 (UTC)
Goto Top
Hi,
wenn ich bei mir
[datetime]"6/17/2017 4:30:05 PM"  
eingebe, dann kommt
Samstag, 17. Juni 2017 16:30:05
raus.

E.
Member: Apophis
Apophis Jun 20, 2017 at 11:39:32 (UTC)
Goto Top
Yay, jetzt geht's.

    $strtime=[datetime]($job.actualstarttime)    
    $finjob = ($strtime).addseconds($job.elapsedtimeseconds)	

Dein Tipp war Gold wert, Danke.

Gruß
Apophis
Member: AndreasHoster
Solution AndreasHoster Jun 20, 2017 at 11:44:47 (UTC)
Goto Top
Die Datumsformate sind echt ein ...

Nach ein bischen experimentieren sollte folgendes gehen (wenn das Format gleich bleibt):
$en = New-Object system.globalization.cultureinfo(“en-US”)
$finjob = ([datetime]::parseexact($job.actualstarttime,"M/d/yyyy h:mm:ss tt",$en)).addseconds($job.elapsedtimeseconds)  
[datetime] alleine nimmt irgendeine Datumsformatdefinition, mit der .Net Funktion parseexact kann man den Formatstring mitangeben, dann klappt auch die Konvertierung.
Member: Apophis
Apophis Jun 20, 2017 at 12:24:32 (UTC)
Goto Top
Hallo,

yep, das funktioniert ebenso.

Danke.

Gruß
Apophis