首页 > 解决方案 > 将空 REST 数据转换为日期时间时如何避免错误

问题描述

我正在使用 REST API 将发票数据从外部公司提取到使用 PowerShell 的 Excel 文件中。我可以使用 Invoke-RestMethod 很好地提取数据。虽然,当它提取日期时间字段时,它的格式是我不喜欢的。为了尽可能地自动化我的工作,有没有办法将数据转换为日期时间。请记住,并非每个字段都有数据,因此存在导致错误的空字段。我基本上想提取所有数据,如果它的日期时间格式丑陋,请将其更改为我想要查看的方式,或者如果它为空,则继续。

我试过 [nullable[datetime]] (在谷歌某处找到它),但这会引发其他错误。我曾尝试使用“IF”,但这也会产生一组语法错误。

$out = Invoke-RestMethod -Uri $assetsURL
#$out.Invoices | Export-Excel $outputcsv
$out.Invoices |
    Select-Object * |
    ForEach-Object {
        $Properties = [ordered]@{
        InvoiceNumber = $_.InvoiceNumber
        DueDate = $_.DueDate #[datetime]::parseexact($_.DueDate, 'yyyy-MM-ddThh:mm:ss', $null).ToString('yyyy-MM-dd')
        Currency = $_.Currency
        TotalDue = $_.TotalDue
        PeriodFrom = $_.PeriodFrom #[datetime]::parseexact($_.PeriodFrom,'yyyy-MM-ddThh:mm:ss', $null).ToString('yyyy-MM-dd')
        PeriodTo = $_.PeriodTo #[datetime]::parseexact($_.PeriodTo,'yyyy-MM-ddThh:mm:ss', $null).ToString('yyyy-MM-dd')
        BillingName = $_.BillingName
        BillingAddress = $_.BillingAddress
        BillingAttentionTo = $_.BillingAttentionTo
        BillingCity = $_.BillingCity
        BillingState = $_.BillingState
        BillingPostalCode = $_.BillingPostalCode
        RemitToName = $_.RemitToName
        RemitToAddress = $_.RemitToAddress
        RemitToAttentionTo = $_.RemitToAttentionTo
        RemitToCity = $_.RemitToCity
        RemitToState = $_.RemitToState
        RemitToPostalCode = $_.RemitToPostalCode
        Lease = $_.Lease
        Schedule = $_.Schedule
        CreatedDate = $_.CreatedDate #[datetime]::parseexact($_.CreatedDate, 'yyyy-MM-ddThh:mm:ss',    $null).ToString('yyyy-MM-dd')
        }
    New-Object psobject -Property $Properties
 } | Export-Excel $outputcsv

只是更新,因为我可能不清楚问题是什么。在“DueDate”、“PeriodFrom”、“PeriodTo”和“CreatedDate”列中,这些都是从 REST API 中提取的。'DueDate' 和 'CreatedDate' 似乎已正确填充,但 'PeriodFrom' 和 'PeriodTo' 可能有也可能没有日期。

目前,没有任何技巧,日期(如果存在)返回为:

2019-09-05T00:00:00

如果它不存在,我想返回一个空字段,或者如果它退出,则返回如下所示的日期:

2019-09-05

标签: restpowershellforeachproperties

解决方案


您可以使用TryParseExact

ForEach-Object {
    $parsedDate = [datetime]::MinValue
    $Properties = [ordered]@{ # remove the CreatedDate from the HashTable
    [...]

if ([datetime]::TryParseExact($_.CreatedDate,'yyyy-MM-ddThh:mm:ss',
[System.Globalization.CultureInfo]::InvariantCulture,
[System.Globalization.DateTimeStyles]::None,[ref]$ParsedDate)) 
{$Properties.Add("CreatedDate", $parsedDate.ToString("yyyy-MM-dd"))}
}

else {
$Properties.Add("CreatedDate",$null)
}

请注意,您可以添加字符串格式数组而​​不是单个字符串,例如:

[String[]]$DateStrings = "M/dd/yyyy h:mmtt","M/d/yyyy h:mmtt","MM/d/yyyy h:mmtt"

那么它将是:

[datetime]::TryParseExact($_.CreatedDate,$DateStrings...)

推荐阅读