This post will show two ways to determine the time span between two datetimes.
Earlier this year we performed a data migration to our data center. One of the Assistant Directors sent me an instant message first thing on a Monday morning to ask if the migration was complete. I had read that it completed earlier that morning and so I replied with the time at which it ended. The second question was how long the entire data migration took. I knew it started at 11 a.m. on Friday and that it completed at 7:21 a.m. on Monday. I could have done this in my head (11 a.m. Friday to 11 a.m. Monday equals 3 days, minus 4 hours, etc.) but I trust Windows PowerShell with dates, times, and time spans more than I do myself.
The first thing I did was assign a variable, $StateDate, with the date and time when the data migration started. After testing to see it held the proper date and time, I created a second variable, $EndDate, and assigned it the date and time when the data migration ended. I also checked that it stored the correct date and time before moving on.
PS C:\> $StartDate = Get-Date '5/9/2014 11:00:00 AM' PS C:\> $StartDate Friday, May 09, 2014 11:00:00 AM PS C:\> $EndDate = Get-Date '5/12/2014 07:21:00 AM' PS C:\> $EndDate Monday, May 12, 2014 7:21:00 AM
I was aware of the New-TimeSpan cmdlet, which we’ll use below, but I wondered if I could simply subtract the start date (the smaller date and time) from the end date (the larger date and time). I tried and it worked! Two days, 20 hours, 21 minutes.
PS C:\> $EndDate - $StartDate Days : 2 Hours : 20 Minutes : 21 Seconds : 0 Milliseconds : 0 Ticks : 2460600000000 TotalDays : 2.84791666666667 TotalHours : 68.35 TotalMinutes : 4101 TotalSeconds : 246060 TotalMilliseconds : 246060000
Here’s an example of using the New-TimeSpan cmdlet. Using this cmdlet may be easier, as to not confuse which date to subtract from which.
PS C:\> New-TimeSpan -Start $StartDate -End $EndDate Days : 2 Hours : 20 Minutes : 21 Seconds : 0 Milliseconds : 0 Ticks : 2460600000000 TotalDays : 2.84791666666667 TotalHours : 68.35 TotalMinutes : 4101 TotalSeconds : 246060 TotalMilliseconds : 246060000
I didn’t want anything more returned to me other than the days, hours, and minutes. I piped my results from the New-TimeSpan cmdlet to the Select-Object cmdlet and specified the properties I wanted returned. The output wasn’t great (see the final example on this page) and so I took those results and piped them to the Format-List cmdlet.
PS C:\> New-TimeSpan -Start $StartDate -End $EndDate | Select-Object Days,Hours,Minutes | Format-List Days : 2 Hours : 20 Minutes : 21
Here’s how I finished up. I created a new variable, $TimeSpan, and assigned it the results of the New-TimeSpan cmdlet piped the Select-Object cmdlet. Before going any further, I tested that the variable’s value was storing what I wanted. Once I was sure the variable contained what I wanted, I modified it a bit and sent it to the clipboard so it could be easily pasted into my instant messenger program.
PS C:\> $TimeSpan = New-TimeSpan -Start $StartDate -End $EndDate | Select-Object Days,Hours,Minutes PS C:\> $TimeSpan Days Hours Minutes ---- ----- ------- 2 20 21 PS C:\>"$($TimeSpan.Days) Days, $($TimeSpan.Hours) Hours, $($TimeSpan.Minutes) Minutes" | clip