【问题标题】:In Powershell how can I convert the date 'June 6th 2017, 08:09:05.000' to [DateTime]?在 Powershell 中,如何将日期“2017 年 6 月 6 日,08:09:05.000”转换为 [DateTime]?
【发布时间】:2019-03-09 02:00:21
【问题描述】:

当尝试转换时,我收到以下错误消息,显然是因为 th 符号。

无法将值“2017 年 6 月 6 日,08:09:05.000”转换为类型“System.DateTime”。错误:“字符串未被识别为有效的日期时间。有 从索引 6 开始的未知单词。

【问题讨论】:

    标签: powershell powershell-4.0


    【解决方案1】:

    最简单的方法可能是删除这些字符。我很确定您可以使用 Parse 或 ParseExact 来做到这一点,但为了方便起见,我只会选择删除“th”。

    $date = "June 6th 2017, 08:09:05.000"
    $date = $date -replace "(\d)(th|nd|st|rd)",'$1'
    [datetime]$date
    

    如果前面有数字,则替换“th”等。如果您碰巧有没有这些字符的日期,则不会发生任何事情,因此没有风险。由于像 August 这样的月份,仅使用 $date = $date -replace "th|nd|st|rd" 直接删除字母是不安全的。

    为了完整起见,您可以使用parseexact() 获取此信息。

    [DateTime]::ParseExact($date, "MMMM d\t\h yyyy, HH:mm:ss.FFF", [System.Globalization.CultureInfo]::InvariantCulture)
    

    这样有效并涵盖了一个基础。如果使用其他数字后缀会更难,所以第一个建议更好。

    【讨论】:

    • 你打错了。 $date 应该是 6 月 6 日而不是 6 日
    • 那很淘气 ;)
    • \t\h 不会涵盖1st2nd3rd,并且由于日期时间格式don't support wildcards 或其他格式(至少是AFAIK),删除序数指示符可以说是更清洁的方法。
    • @AnsgarWiechers 我知道。 ... 一个基础。如果使用其他数字后缀会更难,所以第一个建议更好。我只是想添加其他方式。有一部分感觉像是在欺骗我。
    • @Yury 替换可以正常工作,但演员会失败,因为它应该在每个人身上完成。不是整体。我不确切知道您的问题是什么,但这可能会有所帮助。 [datetime[]]$dates
    【解决方案2】:

    删除“th”部分。您可以将其替换为空,最后删除逗号后将解决您解析它的目的。

    $a="June 6th 2017, 08:09:05.000"
    [System.DateTime]"$($a.Replace("th",'').Replace(',',''))"
    

    输出:

    2017 年 6 月 6 日 08:09:05

    希望对你有帮助

    【讨论】:

    • 逗号对我来说没问题。
    • @Matt:哦,是的。即使我现在检查了。它使用逗号没有任何问题。 :)
    【解决方案3】:

    正如其他人所建议的那样,如果存在“nd”、“th”等,则需要删除它们。我会像这样使用替换:

    [datetime]("June 6th 2017, 08:09:05.000" -replace '(\d+)\w{2}\s','$1 ')
    [datetime]("June 6 2017, 08:09:05.000" -replace '(\d+)\w{2}\s','$1 ')
    [datetime]("6 June 2017, 08:09:05.000" -replace '(\d+)\w{2}\s','$1 ')
    

    他们都回来了:

    Tuesday, June 06, 2017 8:09:05 AM
    

    【讨论】:

      【解决方案4】:

      有效:

      $DateFull -replace "nd",'' -replace "st",'' -replace "rd",'' -replace "th",''
      

      【讨论】:

      • 好吧,我是个白痴,忘记了后缀是如何工作的,也没有添加其他变体。我现在添加了它们。你不需要把它们锁起来。此外,如果你什么都不用替换它们,那么你可以省略 ,''
      • @Matt 和 lookbehind 你的 RegEx 也可以 ;-) $date -replace "(?<=\d)(st|nd|rd|th)"
      猜你喜欢
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多