PowerShell can do a lot of things and, like any good programming language, it can do just about anything you want with dates. Using the PowerShell Get Date command and other techniques, you can find today’s date, tomorrow’s date, format dates, and a whole lot more.
In this article, you’re going to learn all about dates and PowerShell!
Prerequisites
To follow along with the examples in this article, please ensure you have the following prerequisites met ahead of time:
- Windows PowerShell v5 or above – Even if you’re using an earlier version, all examples will still probably work fine.
Finding the Current Date with PowerShell
One of the easiest ways to discover the current date with PowerShell is by using the Get-Date
cmdlet. This command displays the current date and time as shown below.
PS> Get-Date
Sunday, November 22, 2020 1:25:57 AM
By default, PowerShell Get Date command looks like it only returns the current date and time but, in reality, it’s actually returning a lot more information. To find this information pipe the output to the Format-List
cmdlet as shown below.
PS> Get-Date | Format-List
DisplayHint : DateTime
Date : 11/22/2020 12:00:00 AM
Day : 22
DayOfWeek : Sunday
DayOfYear : 327
Hour : 1
Kind : Local
Millisecond : 163
Minute : 26
Month : 11
Second : 2
Ticks : 637416051621635773
TimeOfDay : 01:26:02.1635773
Year : 2020
DateTime : Sunday, November 22, 2020 1:26:02 AM
You can also use the
Get-Member
cmdlet to find all of the object properties by runningGet-Date | Get-Member -MemberType Properties
also.
If you check the type of object Get-Date
returns, you’ll notice it’s a System.DateTime
object type. This class is what exposes all of the different properties and methods you see. You can discover it’s object type by using Get-Member
or using the GetType()
as shown below.
PS> (Get-Date).GetType().FullName
System.DateTime
Once you see all of the available properties you have available, you can then reference them with dot notation as shown below.
PS> (Get-Date).Year
2020
PS> (Get-Date).DayOfWeek
Sunday
PS> (Get-Date).Month
11
PS> (Get-Date).DayOfYear
327
Is dot notation a bit too “devvy” for you? If so, you can also use the DisplayHint
parameter to achieve the same result.
PS> Get-Date -DisplayHint Date
Sunday, November 22, 2020
PS> Get-Date -DisplayHint Time
2:29:35 AM
PS> Get-Date -DisplayHint DateTime
Sunday, November 22, 2020 2:29:39 AM
Using PowerShell Get Date is the simplest way to find the current date and various attributes but you can do so much more!
Date Arithmetic with PowerShell
Let’s say that you need to know the date and/or time a certain number of days, years, or minutes in the past or in the future. You can find this information using methods.
Using DateTime
Methods
The System.DateTime
object that PowerShell Get Date command returns has various methods you can invoke to add or remove chunks of time. If you run Get-Date | Get-Member
, you’ll see various methods that start with Add
.
AddDays Method datetime AddDays(double value)
AddHours Method datetime AddHours(double value)
AddMilliseconds Method datetime AddMilliseconds(double value)
AddMinutes Method datetime AddMinutes(double value)
AddMonths Method datetime AddMonths(int months)
AddSeconds Method datetime AddSeconds(double value)
AddTicks Method datetime AddTicks(long value)
AddYears Method datetime AddYears(int value)
You can call each of these methods to find a date/time in the future or in the past. Below you’ll see a few examples of invoking each of these methods and their output.
#Adding 8 days to the current date
PS> (Get-Date).AddDays(8)
Monday, November 30, 2020 1:59:39 AM
#Adding 3 hours to the current time
PS> (Get-Date).AddHours(3)
Sunday, November 22, 2020 4:59:51 AM
#Adding five years to the current date
PS> (Get-Date).AddYears(5)
Saturday, November 22, 2025 2:00:11 AM
#Subtracting 8 days from the current date using a negative number.
PS> (Get-Date).AddDays(-8)
Saturday, November 14, 2020 2:02:43 AM
Using New-Timespan
What if you wanted to know the difference between two dates; not just adding a specific number of time chunks? One way to do this is to use the New-Timespan
cmdlet. The New-Timespan
cmdlet generates TimeSpan
objects which represent date/time differences or spans.
Use the New-TimeSpan
cmdlet by providing a Start
and End
date/time as parameters. For example, if you’d like to find the difference between November 23rd, 2020 at midnight to December 31st, 2020 at midnight, you could use the following code snippet.
Using TimeSpan
objects, you can find date/time differences in just about any increment you’d like.
PS> $StartDate = Get-Date -Month 11 -Day 23 -Year 2020 -Hour 00 -Minute 00 -Second 00
PS> $EndDate = Get-Date -Month 12 -Day 31 -Year 2020 -Hour 00 -Minute 00 -Second 00
PS> $StartDate
Monday, November 23, 2020 12:00:00 AM
PS> $EndDate
Thursday, December 31, 2020 12:00:00 AM
PS> New-TimeSpan -Start $StartDate -End $EndDate
Days : 38
Hours : 0
Minutes : 0
Seconds : 0
Milliseconds : 672
Ticks : 32832006722080
TotalDays : 38.0000077801852
TotalHours : 912.000186724444
TotalMinutes : 54720.0112034667
TotalSeconds : 3283200.672208
TotalMilliseconds : 3283200672.208
Comparing Dates
Not only can you find differences in dates and times but you can also compare them using standard PowerShell operators. PowerShell knows when a date is “less than” (earlier than) or “greater than” (later than) another date.
To compare dates, simply create two DateTime
objects using PowerShell Get Date command or perhaps by casting strings with [DateTime]
and then using standard PowerShell operators like lt
or gt
.
You can see a simple example of comparing dates below.
#Declaring the date
PS> $Date1 = (Get-Date -Month 11 -Day 14 -Year 2020)
PS> $Date2 = Get-Date
PS> $Date1 -lt $Date2
True
Converting (Casting) Strings to DateTime Objects
PowerShell can also display dates in various formats. For example, let’s say you have a CSV file or spreadsheet with various dates defined in the format you see below in the date_time_utc
column. The format is currently YYYY-MM-DDThh:mm:ss.0000000Z
.
You’d like to parse this file and find all of the rows with a date seven days or older.
PowerShell, by default, doesn’t know that 2020-09-07T13:35:08.4780000Z
is a date and time; it just thinks it’s a simple string. To make PowerShell understand, you must first convert it to a DateTime
object like Get-Date
returns.
To cast a string to a DateTime
object, preface the string (or variable) with [DateTime]
. When you do this, PowerShell tries to interpret the string as a date and time then provides you with all of the properties and methods available on this object type.
PS> $Date = "2020-09-07T13:35:08.4780000Z"
PS> [DateTime]$Date
Monday, September 07, 2020 1:35:08 PM
Using PowerShell Get Date : PowerShell Date Formatting
Now that you are aware of the basic methods of using dates, it’s time to delve deeper into the topic. Let’s play around a bit more by using different formats to display dates.
Whenever you run the PowerShell Get Date command, you will see an output like Monday, September 07, 2020 1:35:08 PM
. This output is actually a DateTime
object with properties and methods; not a simple string. But, you can convert this DateTime
object to a string and represent it differently using various date formatting methods.
DateTime
Methods
One way to change up how a DateTime
object is displayed is by using methods on the DateTime
object. The DateTime
object has four methods you can use to change up the formatting:
ToLongDateString()
ToShortDateString()
ToLongTimeString()
ToShortTimeString()
You can see an example of using the ToShortDateString()
and ToShortTimeString()
methods below.
PS> [DateTime]$Date = $Date
PS> $date.ToShortDateString() + " " + $date.ToShortTimeString()
9/7/2020 7:05 PM
The Format
Parameter
One way to change the date format of a DateTime
object is by using Get-Date
to generate the object and the Format
parameter to change the format. The Format
parameter accepts a string of characters each representing how a date/time string should look.
You can see a few examples of the characters you can use with the Format
parameter.
#To display full date pattern with short time pattern
PS> Get-Date -Format f
Sunday, November 22, 2020 4:26 AM
#To display full date pattern with long time pattern
PS> Get-Date -Format F
Sunday, November 22, 2020 4:26:31 AM
#To display short date pattern
PS> Get-Date -Format d
11/22/2020
#To display long date pattern
PS> Get-Date -Format D
Sunday, November 22, 2020
#Year month pattern
PS> Get-Date -Format Y
November 2020
## Combining format characters
PS> Get-Date -Format "dddd dd-MM-yyyy HH:mm K"
Sunday 22-11-2020 03:41 +05:30
Check out the Microsoft documentation for a full breakdown of all the characters you can use with the
Format
parameter.
You’ll see as soon as you use the Format
parameter, Get-Date
no longer returns a DateTime
object but now strings a string.
PS> (Get-Date -Format D).GetType().FullName
System.String
The UFormat
Parameter
Similar to the Format
parameter, you also have a UFormat
parameter with the Get-Date
cmdlet. The UFormat
parameter allows you to define date formats by using UNIX date formatting.
The UFormat
parameter is similar to the Format
parameter in that you can combine date format characters to change how the date is returned as a string. For example, try out the following formats and see what’s returned.
PS> Get-Date -UFormat %A
PS> Get-Date -UFormat %b
PS> Get-Date -UFormat %B
You can also combine these date format characters. The code snippet below uses the d
, m
, and Y
characters to return the date in the format dd-mm-yyyy and
uses the r
character to return the time 12-hour format using the time zone t
character.
PS> Get-Date -UFormat "%d-%m-%Y %r %Z"
22-11-2020 06:10:55 PM +05
Check out the Microsoft documentation for a full breakdown of all the characters you can use with the UFormat
parameter.