45

I can't get my head around how formatting a datetime variable inside a string works in PowerShell.

$startTime = Get-Date
Write-Host "The script was started $startTime"

# ...Do stuff...

$endTime = Get-Date
Write-Host "Done at $endTime.  Time for the full run was: $( New-TimeSpan $startTime $endTime)."

gives me the US date format while I want ISO 8601.

I could use

$(Get-Date -Format u)

but I want to use $endTime to make the calculation of the timespan correct.

I have tried all permutations of $, (, ), endTime, -format, u, .ToString(...) and .ToShortDate(), but the one that works.

3 Answers 3

75
"This is my string with date in specified format $($theDate.ToString('u'))"

or

"This is my string with date in specified format $(Get-Date -format 'u')"

The sub-expression ($(...)) can include arbitrary expressions calls.

Microsoft Documents both standard and custom DateTime format strings.

Sign up to request clarification or add additional context in comments.

1 Comment

To whit: Write-Output -NoEnumerate ( "The literal date is {0:d}" -f $([DateTime]::parseexact($theLiteralDate, 'yyyyMMdd', $null))); where the desired date format here is yyyy-mm-dd for the orignal date string literal 20180612. Use {0:u} for sortable ISO. The string travels through the world of DateTime and emerges back as a string in the right format. Bypassable? Frankly all of these are a bit of a PITA.
46

You can use the -f operator

$a = "{0:D}" -f (get-date)
$a = "{0:dddd}" -f (get-date)

Spécificator    Type                                Example (with [datetime]::now)
d   Short date                                        26/09/2002
D   Long date                                       jeudi 26 septembre 2002
t   Short Hour                                      16:49
T   Long Hour                                       16:49:31
f   Date and hour                                   jeudi 26 septembre 2002 16:50
F   Long Date and hour                              jeudi 26 septembre 2002 16:50:51
g   Default Date                                    26/09/2002 16:52
G   Long default Date and hour                      26/09/2009 16:52:12
M   Month Symbol                                    26 septembre
r   Date string RFC1123                             Sat, 26 Sep 2009 16:54:50 GMT
s   Sortable string date                            2009-09-26T16:55:58
u   Sortable string date universal local hour       2009-09-26 16:56:49Z
U   Sortable string date universal GMT hour         samedi 26 septembre 2009 14:57:22 (oups)
Y   Year symbol                                     septembre 2002

Spécificator    Type                       Example      Output Example
dd              Jour                       {0:dd}       10
ddd             Name of the day            {0:ddd}      Jeu.
dddd            Complet name of the day    {0:dddd}     Jeudi
f, ff, …        Fractions of seconds       {0:fff}      932
gg, …           position                   {0:gg}       ap. J.-C.
hh              Hour two digits            {0:hh}       10
HH              Hour two digits (24 hours) {0:HH}       22
mm              Minuts 00-59               {0:mm}       38
MM              Month 01-12                {0:MM}       12
MMM             Month shortcut             {0:MMM}      Sep.
MMMM            complet name of the month  {0:MMMM}     Septembre
ss              Seconds 00-59              {0:ss}       46
tt              AM or PM                   {0:tt}       ““
yy              Years, 2 digits            {0:yy}       02
yyyy            Years                      {0:yyyy}     2002
zz              Time zone, 2 digits        {0:zz}       +02
zzz             Complete Time zone         {0:zzz}      +02:00
:               Separator                  {0:hh:mm:ss}     10:43:20
/               Separator                  {0:dd/MM/yyyy}   10/12/2002

3 Comments

The MSDN pages for standard and custom format strings have plenty of examples, even in different languages :). +1 for suggesting format strings which is in my opinion preferrable here.
$a becomes a string, n'est-ce pas? I needed a real string object. The way to set the formatting first and then the value was new for me. Thanks.
Thanks @Joey, I just was not able to put my finger on these pages, so I copy paste one of my document.
10

Instead of using string interpolation you could simply format the DateTime using the ToString("u") method and concatenate that with the rest of the string:

$startTime = Get-Date
Write-Host "The script was started " + $startTime.ToString("u") 

1 Comment

Valid solution. Lacks "string inside string" though. There is no /real/ reason for me to not concatenate instead of string-inside-string.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.