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
1 2 3 |
[DateTime]$start = Get-Date [DateTime]$stop = $start.AddMinutes(3) ($stop - $start).GetType().Name |
wynik to
1 |
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:
1 2 3 4 5 6 7 8 |
[DateTime]$start = Get-Date [DateTime]$stop = $start.AddMinutes(3) [TimeSpan]$diff = $stop - $start $diff.Minutes $diff.Seconds $diff.TotalSeconds $diff.Ticks |
Wynik to:
1 2 3 4 |
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:
1 2 |
$start $start.Add([TimeSpan]::FromMinutes(5)) |
oto wynik:
1 2 |
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:
1 |
$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:
1 |
New-TimeSpan -Start $start -End $stop |
wynik można jak zwykle zapisać w zmiennej:
1 |
$diff = New-TimeSpan -Start $start -End $stop |
a potem korzystać z niej tak, jak robiliśmy to do tej pory:
1 |
$diff.TotalSeconds |