开发者问题收集

PowerShell 中的日期时间无法转换我的时间

2021-02-15
513

我正在编写一个脚本来比较两组时间值,然后计算出一个准确的时间。

我的问题是使用时间戳进行计算。我从 .csv 文件导入时间。时间如下所示:

08:37;
11:47;
12:11;
17:34;
etc.

我为时间创建了一个变量,因此我始终可以从 csv 文件中的正确行获得正确的时间。 我的目标是计算从一个时间戳到另一个时间戳的时间,如下所示:11:47 - 08:37 = 3:10

如果我在 PowerShell 脚本中执行此操作,则会出现错误:值“time=12:39”无法转换为类型“System.DateTime”。错误:“该字符串未被识别为 DateTime。未知单词从索引 1 开始”

在这种情况下,datetime 是否错误?我该如何让它工作?

感谢您的帮助。

2个回答

如果这与您的 上一个问题 有关,并且 CSV 实际上如下所示:

name;prename;date;time
Gantz;Mario;09.02.;07:37
Gantz;Mario;09.02.;11:23
Gantz;Mario;09.02.;12:34
Gantz;Mario;09.02.;17:03

那么应该可以做到

# create two variables to hold the times parsed from the CSV, Initialize to $null
$current, $previous = $null
# load the csv and loop through the records
$result = Import-Csv -Path 'D:\Test\times.csv' -Delimiter ';' | ForEach-Object {
    $current = [datetime]::ParseExact($_.time, 'HH:mm', $null)
    if (!$previous) { $previous = $current }
    # subtracting two DateTime objects results in a TimeStamp
    $elapsed  = $current - $previous
    $previous = $current
    # output the record with column 'elapsed' appended
    $_ | Select-Object *, @{Name = 'elapsed'; Expression = {$elapsed.ToString()}}
}

# output on screen
$result | Format-Table -AutoSize

# output to new CSV file
$result | Export-Csv -Path 'D:\Test\times_and_intervals.csv' -Delimiter ';' -NoTypeInformation

屏幕上的输出:

name  prename date   time  elapsed 
----  ------- ----   ----  ------- 
Gantz Mario   09.02. 07:37 00:00:00
Gantz Mario   09.02. 11:23 03:46:00
Gantz Mario   09.02. 12:34 01:11:00
Gantz Mario   09.02. 17:03 04:29:00

现在我看到您其中还有一个“日期”列,您也应该将其包括在转换为 [datetime] 的过程中:

# create two variables to hold the times parsed from the CSV, Initialize to $null
$current, $previous = $null
# load the csv and loop through the records
$result = Import-Csv -Path 'D:\Test\times.csv' -Delimiter ';' | ForEach-Object {
    $completeDate = '{0}{1} {2}' -f $_.date, (Get-Date).Year, $_.time
    $current = [datetime]::ParseExact($completeDate, 'dd.MM.yyyy HH:mm', $null)
    if (!$previous) { $previous = $current }
    # subtracting two DateTime objects results in a TimeStamp
    $elapsed  = $current - $previous
    $previous = $current
    # output the record with column 'elapsed' appended
    $_ | Select-Object *, @{Name = 'elapsed'; Expression = {$elapsed.ToString()}}
}

# output on screen
$result | Format-Table -AutoSize

# output to new CSV file
$result | Export-Csv -Path 'D:\Test\times_and_intervals.csv' -Delimiter ';' -NoTypeInformation
Theo
2021-02-15

您收到错误是因为您没有指定要导入为 [datetime] 的值 我复制了错误,其中我仅指定了 2 个时间值并将它们相减:

$st = "08:37" $et = "11:47" $di = $st - $et Cannot convert value "08:37" to type "System.Int32". Error: "Input string was not in a correct format." enter image description here

解决方案: 像这样指定每个条目的值:

[datetime]$starttime = "08:37"
[datetime]$endtime = "11:47"
$diff = $endtime - $starttime

在此处输入图像描述

如果您只想要以分钟为单位的时间,您可以分别输入 $diff.Minutes

希望这对您有用。

Clint Oliveira
2021-02-15