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)
| 归档时间: |
|
| 查看次数: |
45 次 |
| 最近记录: |