在PowerShell中将字符串转换为日期时间

wsxa1bj1  于 2022-12-23  发布在  Shell
关注(0)|答案(8)|浏览(197)

我正在使用PowerShell尝试将字符串转换为日期时间。这应该很容易,对吗?
我正在从CSV导入中获取字符串,它的格式为Jul-16。我尝试了多种方法将其转换为我想要的格式yyyy-MM-dd,目前我处于以下状态。

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

但我得到的错误:
字符串未被识别为有效的DateTime。
我错过什么了吗?

06odsfpq

06odsfpq1#

ParseExact被告知它期望解析的日期格式,而不是您希望输出的格式。

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

如果希望输出日期字符串:

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

z9gpfhce2#

您可以简单地将字符串转换为DateTime:

[DateTime]"2020-7-16"

[DateTime]"Jul-16"

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

您可以通过执行以下操作来格式化生成的DateTime变量:

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

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

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

lc8prwob3#

您需要指定格式 * 它已经具有 *,以便解析它:

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

现在,您可以将其输出为所需的格式:

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

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

qjp7pelc4#

Chris Dents的回答已经涵盖了OP的问题,但鉴于这是谷歌上PowerShell format string as date的顶级搜索,我想我会给出一个不同的字符串示例。
如果像我一样,你得到的时间字符串是20190720170000.000000+000
需要注意的一点是,在使用[System.Management.ManagementDateTimeConverter]时需要使用ToUniversalTime(),否则会得到与输入的偏移时间。

PS代码

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)

输出

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

[Management.ManagementDateTimeConverter]上的MS文档:
https://learn.microsoft.com/en-us/dotnet/api/system.management.managementdatetimeconverter?view=dotnet-plat-ext-3.1

vom3gejh

vom3gejh5#

$invoice = "Jul-16"
[datetime]$newInvoice = "01-" + $invoice

$newInvoice.ToString("yyyy-MM-dd")

这样就可以使用一个类型加速器了,而且还转换成了一个新的var,如果你想在其他地方使用它,可以这样使用它:$newInvoice.ToString("yyyy-MM-dd")作为$newInvoice将始终是日期时间格式,除非您以后将其转换为字符串,但将失去执行日期时间函数的能力-添加天数等...

t30tvxxf

t30tvxxf6#

希望下面能有所帮助!

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

现在类型已转换。您可以使用方法或访问任何属性。

Example :$Format_date.AddDays(5)
icnyk63a

icnyk63a7#

这很容易在我的情况下,它与
输入:

$Date = '29-07-2022'

日期格式转换:

[datetime]::parseexact($date, 'dd-MM-yyyy', $null).ToString('dd-MMMM-yyyy')

输出:

vbkedwbf

vbkedwbf8#

我有一个不同但相关的需要,将一个数字(秒)转换为天/小时/秒等。

$seconds = 41414141
New-Timespan -seconds $seconds

相关问题