Demystifying PowerShell Dates, DateTime and Formatting

Vignesh Mudliar

Read more posts by this author.

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, Get-Date 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 running Get-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 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 Get-Date 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 Get-Date 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.

Date Format Example
Date Format Example

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

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 Get-Date, 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 Ycharacters 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.

Subscribe to Adam the Automator

Get the latest posts delivered right to your inbox

Looks like you're offline!