从ISO 8601持续时间获取DateTime对象

Dav*_*ard 2 powershell datetime timespan iso8601

在PowerShell中,是否可以将ISO 8601指定持续时间转换 DateTime对象?例如,PT30M是30分钟前,所以如果现在是2019-07-31 17:00:00我想要的时间戳记2019-07-31 16:30:00

我已经尝试过显而易见的-

"PT30M" | Get-Date
Run Code Online (Sandbox Code Playgroud)

但这(毫不奇怪地失败了)

Get-Date:输入对象不能绑定到该命令的任何参数,因为该命令不接受管道输入,或者该输入及其属性与接受管道输入的任何参数都不匹配。

我的下一个想法是编写一个将提取天,小时和分钟的函数(例如,最多最多30天)。为此,下面的函数可以$startTime根据$Duration传入的内容工作并创建。

但是,感觉有点不对劲。首先,正则表达式只非常具体地检查几天,几分钟和几小时,而其余的$Duration可能完全是垃圾。其次,一旦考虑到诸如秒,周和月之类的事情,那将很麻烦。

是否有内置的方法来执行此操作,还是在最佳选项下坚持使用该功能?

function Get-TimespanFromDuration
{
    param(
        [Parameter(Mandatory)]
        [string]$Duration
    )

    $now = (Get-Date).ToUniversalTime()
    $dataTimeAgo = @{ "Days" = 0; "Hours" = 0; "Minutes" = 0 }

    ### Work out how may days ago.
    $daysAgo = $Duration -match "\D([1-9]|[1-2][0-9]|30)D"
    if ($daysAgo)
    {
        [int]$dataTimeAgo["Days"] = $matches[0] -replace "\D+"
    }

    ### Work out how may hours ago.
    $hoursAgo = $Duration -match "\D([1-9]|1[0-9]|2[0-4])H"
    if ($daysAgo)
    {
        [int]$dataTimeAgo["Hours"] = $matches[0] -replace "\D+"
    }

    ### Work out how many minutes ago.
    $minutesAgo = $Duration -match "\D([1-9]|[1-5][0-9]|60)M"
    if ($minutesAgo)
    {
        [int]$dataTimeAgo["minutes"] = $dataTimeAgo["minutes"] + ($matches[0] -replace "\D+")
    }

    $startTime = $now.AddDays(-($dataTimeAgo["Days"])).AddHours(-($dataTimeAgo["hours"])).AddMinutes(-($dataTimeAgo["minutes"])).ToString("yyyy-MM-ddTHH:mm:ss.0Z")
    $endTime = $now.ToString("yyyy-MM-ddTHH:mm:ss.0Z")

    return ("{0}/{1}" -f $startTime, $endTime)
}
Run Code Online (Sandbox Code Playgroud)

vrd*_*dse 5

您可以在PowerShell中使用一个.NET类: [System.Xml.XmlConvert]::ToTimeSpan("PT30M")