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?
16 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
2You 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 1You 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]:
$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)