将字符串数组转换为datetime

问题描述 投票:0回答:2

我有一个字符串即时转换为datetime格式,工作得很好:

$d = 'hourly-12-18-2017-20-15-00' -split '-'

得到我:

hourly
12
18
2017
20
15
00

将其转换为日期时间

$i = Get-Date -Day $d[2] -Month $d[1] -Year $d[3] -Hour $d[4] -Minute $d[5] -Second $d[6]

得到我:

18. december 2017 20:15:00

这是我期望的,它的工作原理。

现在实际上这是一个字符串列表,所以我试图循环它。转换后的实际列表:

 hourly
 12
 28
 2017
 10
 15
 00
 hourly
 12
 28
 2017
 11
 15
 02

等等..

我试图写出这些格式化:

foreach ($i in $d) {

$i = @(Get-Date -Day $d[2] -Month $d[1] -Year $d[3] -Hour $d[4] -Minute $d[5] -Second $d[6])
$i
}

得到我:

18. december 2017 20:15:00

相反,如果整个列表。只写出最后一个条目。

我也试过了同样的结果:

$d | ForEach-Object {
$i = @(Get-Date -Day $d[2] -Month $d[1] -Year $d[3] -Hour $d[4] -Minute $d[5] -Second $d[6])
}

有任何想法吗?谢谢。

arrays powershell loops
2个回答
2
投票

不要拆分,只需删除hourly-

$D = 'hourly-12-28-2017-10-15-00','hourly-12-28-2017-11-15-02'
$D -replace 'hourly-' | foreach {
    [datetime]::ParseExact($_, "MM-dd-yyyy-HH-mm-ss", $null)
}

Thursday, December 28, 2017 10:15:00 AM
Thursday, December 28, 2017 11:15:02 AM

1
投票

作为another answer has already mentioned,你实际上并不需要首先对每个字符串进行-split,你可以从原始字符串中解析日期。

要解决将大字符串数组划分为每个对应于日期的较小块的问题,您可以执行以下操作:

$strings = @('hourly', '12', '28', '2017', '10', '15', '00', 'hourly', '12', '28', '2017', '11', '15', '02')
do{
    $ds = @{}
    $null,$ds['Month'],$ds['Day'],$ds['Year'],$ds['Hour'],$ds['Minute'],$ds['Second'],$strings = $strings
    Get-Date @ds
} while($strings)

在每次迭代中,hourly字符串将被$null吞噬,接下来的6个字符串(日期时间组件)将填充哈希表,并且(任何)剩余的字符串将被分配回$strings

最后,Get-Date @ds将根据哈希表中的参数值创建新的DateTime对象

© www.soinside.com 2019 - 2024. All rights reserved.