Do pracy z czasem masz w Powershell dwa typy:
- DateTime
- TimeSpan
DateTime to prosta sprawa, ale co to jest TimeSpan? Timespan to właśnie ilość czasu jaki upłynął między dwoma punktami w czasie. Tę różnicę można wyrazić w godzinach, minutach, sekundach albo w… tickach. Tick to najmniejsza jednostka z jaką pracuje ten typ. Popatrz na przykłady:
Wynik odejmowania dwóch obiektów typu DateTime to TimeSpan
[DateTime]$start = Get-Date [DateTime]$stop = $start.AddMinutes(3) ($stop - $start).GetType().Name
wynik to
TimeSpan
Jakie właściwości ma TimeSpan?
Kilka podstawowych to np. minutes, seconds, ticks. Jeśli zapytać ile minut i sekund minęło pomiędzy powyżej zadeklarowanymi punktami czasu, to okaże sie, że 3 minuty i 0 sekund. A co jeśli wynik ma przedstawić czas w sekundach? Czy czeka nas mnożenie ilości dni *24*60*60 plus ilość godzin*60*60 plus ilość minut*60 ? Nie. Do tego można się posłużyć właściwością TotalSeconds! Popatrz na przykład:
[DateTime]$start = Get-Date [DateTime]$stop = $start.AddMinutes(3) [TimeSpan]$diff = $stop - $start $diff.Minutes $diff.Seconds $diff.TotalSeconds $diff.Ticks
Wynik to:
3 0 180 1800000000
3 minuty i 0 sekund lub po prostu 180 sekund lub 1800000000 tick-ów.
Do typu DateTime możesz dodawać TimeSpan
Znowu popatrz na przykład:
$start $start.Add([TimeSpan]::FromMinutes(5))
oto wynik:
28 sierpnia 2016 11:18:21 28 sierpnia 2016 11:23:21
Dla typu DateTime skorzystaliśmy z metody Add, która jako argument przyjęła utworzony właśnie obiekt typu TimeSpan. TimeSpan ma szereg konstruktorów, które pozwolą tworzyć ten typ z godzin, minut, sekund itp. W praktyce z tej metody skorzystasz jednak tylko wtedy, gdy akurat w skrypcie posiadasz obiekt typu TimeSpan, który zechcesz dodać do DateTime, bo przecież jeśli do DateTime chcesz dodać np 5 minut, to o wiele prościej zrobisz to tak:
$start.AddMinutes(5)
Cmdlet New-Timespan
Dla tych, którzy nie lubią deklarowania typów metodami znanymi z .NET i woleliby bardziej PowerShellową metodę, deklarację typu TimeSpan można zamienić na:
New-TimeSpan -Start $start -End $stop
wynik można jak zwykle zapisać w zmiennej:
$diff = New-TimeSpan -Start $start -End $stop
a potem korzystać z niej tak, jak robiliśmy to do tej pory:
$diff.TotalSeconds