rest - 将空 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
解决方案
您可以使用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...)
推荐阅读
- python - 如何排序列表,首先按项目的频率,然后按项目的值
- swift - 如何使用 YouTube API 查询修复 401 错误?
- sql-server - 如何远程连接到位于 Godaddy Windows VPS 上的 SQL Server 2012 数据库,我使用 ssms 进行远程连接
- node.js - 错误 - getHostByAddr ENOTFOUND ::ffff:18.234.32.226
- flutter - 如何使背景不滚动但前景滚动?
- node.js - 如何从频道 discord.js 中获取用户的所有提及
- c# - 在 EF.Core 中将单个实体映射到两个表
- pandas - 在 pandas.df.to_latex() 导出的乳胶表中包装列标题
- azure - 使用 azure devops 管道将控制台 webjob 应用程序部署到包含 webapi 的 azure App 服务
- javascript - 代码输出一个数字而不是未定义?