当前位置: 首页 > 知识库问答 >
问题:

从 ISO 8601 持续时间中获取日期时间对象

曹恩
2023-03-14

在PowerShell中,有没有办法将ISO 8601指定的持续时间转换成DateTime对象?例如,PT30M是30分钟前,因此如果现在的时间是< code>2019-07-31 17:00:00,我希望时间戳为< code>2019-07-31 16:30:00。

我尝试过显而易见的 -

"PT30M" | Get-Date

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

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

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

但是,感觉有点不对劲。首先,正则表达式唯一非常具体地检查了几天,几分钟和几小时,而$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)
}

共有2个答案

麻超
2023-03-14

例如,将"P20W"持续时间转换为时间跨度失败:[system.Xml.XmlConvert]::ToTimeSpan("P20W")方法调用异常:使用"1"参数调用"ToTimeSpan"的异常:"字符串'P20W'不是有效的TimeSpan值。"

根据ISO_8601定义标准,它是有效期限,参见:https://en.wikipedia.org/wiki/ISO_8601

仉磊
2023-03-14

有一个. NET类可以在PowerShell中使用:< code>[System。XML . XML convert]::ToTimeSpan(" PT30M ")

 类似资料:
  • 我有ISO8601格式的持续时间值,我将其转换为时间值为整数秒,如下所示: ISO8601格式的持续时间值=“P1Y”。 我将该值存储在“时间-单位-秒”中。因此,当我检索的值将是在int,我想转换回ISO8601持续时间格式,所以我应该得到“P1Y”转换后回来。 有没有快速的方法可以做到这一点?或者我必须把时间的int值转换成float,然后通过某种方法把它转换成ISO8601持续时间。

  • 我需要一些解释为什么这个代码不编译: 错误: 类型Duration中的(TemporalAmount)方法不适用于参数(ChronoUnit) 正如本文所述: public static Duration from(TemporalAmount amount)从时间量中获取持续时间的实例。这将根据指定的金额获得持续时间。TemporalAmount表示一个时间量,可以是基于日期的,也可以是基于时间

  • 问题内容: 这是我要传递时间戳的Under函数,我只需要从时间戳返回的日期,而不是小时和秒。通过以下代码,我得到了- 这是我得到的输出。 但是我只需要这样的日期 有什么建议? 问题答案: 改用SimpleDateFormat: 更新 :Java 8解决方案:

  • 问题内容: 如何在不创建MediaPlayer实例的情况下获得mp3曲目的持续时间?我只需要在mp3文件列表中显示mp3歌曲的长度,所以我认为我不应该为列表中的每个音轨创建MediaPlayer对象 还有一个: 有时MediaPlayer会返回错误的歌曲持续时间(我认为是错误的,因为这些文件的比特率是动态的)。如何获得正确的歌曲时长? 问题答案: 您可以使用MediaMetadataRetriev

  • 我需要使用API V3获取YouTube内容长度。我的应用程序在API V3上运行良好,但现在不起作用了。 我发现了一个可行的例子,它确实有效: 学分: Youtube API v3 ,如何获取视频时长? 这将返回类似如下的时间格式。 我怎样才能把这个时间缩短到一个可读的时间呢。比如24:30?

  • 给定2个日期,如何根据ISO 8601工期以年-月-日、时-分-秒格式计算它们之间的差异? 我只发现Java库可以在几天或更短的时间内提供差异。 鉴于月份和年份的天数不规则,我不知道如何计算月份和年份的差异。 平均持续时间。between接近,但它以小时分秒为单位给出结果: 也就是25533小时57分58秒 我想看看这样的东西: __年__月__天9小时57分58秒