【问题标题】:Converting date time format in PowerShell在 PowerShell 中转换日期时间格式
【发布时间】:2015-08-04 11:38:05
【问题描述】:

如何将以下日期转换为 dd/mm/yyyy 格式?

Tue Aug  4 17:05:41 2015

我尝试了多种方法和选择,但没有运气。

$a = Get-Date -UFormat %c
(Get-Date $a).ToString("ddMMyyyy")

此日期格式是在日志文件中找到的,我的系统日期时间格式是 dd/mm/yyyy。 我正在尝试对它们进行比较。所以,我需要更改日期时间格式。

【问题讨论】:

  • 为了比较,您最好比较 DateTime 对象本身,而不是它们的 toString() 表示。
  • 感谢您的评论。如果可能,请提供一些有关它的详细信息
  • 就是这样,您通过get-date -format "dd\/MM\/yyyy" 从子字符串中创建一个DateTime 对象,根据当前日期创建另一个对象,然后像整数一样进行比较。 if ($onedate -lt $twodate) {...}

标签: powershell powershell-2.0 powershell-3.0


【解决方案1】:

@jisaak 的答案是几乎,除了日期组件前面的额外填充空间(“Tue Aug 4 17:05 :41 2015") 当您尝试解析一个月的 10 日到 31 日之间的日期时会导致错误:

PS C:\> [Datetime]::ParseExact('Tue Aug  4 17:05:41 2015', 'ddd MMM  d HH:mm:ss yyyy', $us)

Tuesday, August 04, 2015 5:05:41 PM


PS C:\> [Datetime]::ParseExact('Tue Aug 11 17:05:41 2015', 'ddd MMM  d HH:mm:ss yyyy', $us)
Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."
At line:1 char:1
+ [Datetime]::ParseExact('Tue Aug 11 17:05:41 2015', 'ddd MMM  d HH:mm:ss yyyy', $ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : FormatException

解决这个问题的最简单方法是删除输入字符串和格式字符串中的填充空间:

function Parse-CustomDate {
    param(
        [Parameter(Mandatory=$true)]
        [string]$DateString,
        [string]$DateFormat = 'ddd MMM d HH:mm:ss yyyy',
        [cultureinfo]$Culture = $(New-Object System.Globalization.CultureInfo -ArgumentList "en-US")
    )

    # replace double space by a single one
    $DateString = $DateString -replace '\s+',' '

    [Datetime]::ParseExact($DateString, $DateFormat, $Culture)
}

【讨论】:

    【解决方案2】:

    也许是原始的,但它可以完成工作:)

    $Date = 'Tue Aug  4 17:05:41 2015' -split "\s"
    $Year = $Date[-1]
    $Time = $Date | ? {$_ -match "..:..:.."}
    $DayName = $Date[0]
    $Day = $Date[3]
    $Month = $Date[1]
    
    Get-Date "$Month $Day $Year $Time" -Format "ddMMyyy"
    
    04082015
    

    【讨论】:

    • 感谢您的回答,但我不想使用-split。但谢谢。投票赞成。
    【解决方案3】:

    您可以使用日期时间ParseExact 方法:

    $us = New-Object system.globalization.cultureinfo("en-US")
    [Datetime]::ParseExact('Tue Aug  4 17:05:41 2015', 'ddd MMM  d HH:mm:ss yyyy', $us)
    

    正如 Vesper 所说,您现在可以比较日期时间对象。

    【讨论】:

    • 由于日期 (d) 组件前面的双空格,这将在每个月的 10 日到 31 日失败。
    【解决方案4】:

    用途:

    Get-Date -format d
    

    这将为您提供今天的日期,但格式为mm/dd/yyyy。不过要小心;这会给你一个string 而不是integer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多