Powershell: Wyznaczanie różnicy w czasie

28-sie-2016

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

 

Komentarze są wyłączone

Autor: admin