I am using PowerShell to try and convert a string to a datetime. It should be easy, right?

I am getting the string from a CSV import, and it comes in the format of Jul-16. I have tried multiple ways of getting it into the format I want which is yyyy-MM-dd and I am currently at the following.

$invoice = $object.'Invoice Month' $invoice = "01-" + $invoice $invoice = [datetime]::parseexact($invoice, 'yyyy-MM-dd', $null) 

But I get the error:

String was not recognized as a valid DateTime.

Am I missing something?

1

6 Answers

ParseExact is told the format of the date it is expected to parse, not the format you wish to get out.

$invoice = '01-Jul-16' [datetime]::parseexact($invoice, 'dd-MMM-yy', $null) 

If you then wish to output a date string:

[datetime]::parseexact($invoice, 'dd-MMM-yy', $null).ToString('yyyy-MM-dd') 

Chris

2

You can simply cast strings to DateTime:

[DateTime]"2020-7-16" 

or

[DateTime]"Jul-16" 

or

$myDate = [DateTime]"Jul-16"; 

And you can format the resulting DateTime variable by doing something like this:

'{0:yyyy-MM-dd}' -f [DateTime]'Jul-16' 

or

([DateTime]"Jul-16").ToString('yyyy-MM-dd') 

or

$myDate = [DateTime]"Jul-16"; '{0:yyyy-MM-dd}' -f $myDate 
1

You need to specify the format it already has, in order to parse it:

$InvoiceDate = [datetime]::ParseExact($invoice, "dd-MMM-yy", $null) 

Now you can output it in the format you need:

$InvoiceDate.ToString('yyyy-MM-dd') 

or

'{0:yyyy-MM-dd}' -f $InvoiceDate 

Chris Dents' answer has already covered the OPs' question but seeing as this was the top search on google for PowerShell format string as date I thought I'd give a different string example.


If like me, you get the time string like this 20190720170000.000000+000

An important thing to note is you need to use ToUniversalTime() when using [System.Management.ManagementDateTimeConverter] otherwise you get offset times against your input.

PS Code

cls Write-Host "This example is for the 24hr clock with HH" Write-Host "ToUniversalTime() must be used when using [System.Management.ManagementDateTimeConverter]" $my_date_24hr_time = "20190720170000.000000+000" $date_format = "yyyy-MM-dd HH:mm" [System.Management.ManagementDateTimeConverter]::ToDateTime($my_date_24hr_time).ToUniversalTime(); [System.Management.ManagementDateTimeConverter]::ToDateTime($my_date_24hr_time).ToUniversalTime().ToSTring($date_format) [datetime]::ParseExact($my_date_24hr_time,"yyyyMMddHHmmss.000000+000",$null).ToSTring($date_format) Write-Host Write-Host "-----------------------------" Write-Host Write-Host "This example is for the am pm clock with hh" Write-Host "Again, ToUniversalTime() must be used when using [System.Management.ManagementDateTimeConverter]" Write-Host $my_date_ampm_time = "20190720110000.000000+000" [System.Management.ManagementDateTimeConverter]::ToDateTime($my_date_ampm_time).ToUniversalTime(); [System.Management.ManagementDateTimeConverter]::ToDateTime($my_date_ampm_time).ToUniversalTime().ToSTring($date_format) [datetime]::ParseExact($my_date_ampm_time,"yyyyMMddhhmmss.000000+000",$null).ToSTring($date_format) 

Output

This example is for the 24hr clock with HH ToUniversalTime() must be used when using [System.Management.ManagementDateTimeConverter] 20 July 2019 17:00:00 2019-07-20 17:00 2019-07-20 17:00 ----------------------------- This example is for the am pm clock with hh Again, ToUniversalTime() must be used when using [System.Management.ManagementDateTimeConverter] 20 July 2019 11:00:00 2019-07-20 11:00 2019-07-20 11:00 

MS doc on [Management.ManagementDateTimeConverter]:

1
$invoice = "Jul-16" [datetime]$newInvoice = "01-" + $invoice $newInvoice.ToString("yyyy-MM-dd") 

There you go, use a type accelerator, but also into a new var, if you want to use it elsewhere, use it like so: $newInvoice.ToString("yyyy-MM-dd")as $newInvoice will always be in the datetime format, unless you cast it as a string afterwards, but will lose the ability to perform datetime functions - adding days etc...

Hope below helps!

PS C:\Users\aameer>$invoice = $object.'Invoice Month' $invoice = "01-" + $invoice [datetime]$Format_date =$invoice 

Now type is converted. You can use method or can access any property.

Example :$Format_date.AddDays(5) 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy