You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中匹配Month DD, YYYY格式的正确日期格式字符串是什么?

问题描述

无法检测August 20, 2022这类格式的日期字符串,尝试使用month dd, yyyy格式但无效。文件中存在大量此类格式的日期,当前脚本无法识别,需要先解决日期检测问题。

在以下代码中,我将名为$formatsDelimited的日期格式数组传入TryParseExact方法,除了最后添加的month dd, yyyy格式外,其他格式均能正常工作(尽管该格式不属于分隔符类格式)。

代码实现
$formatsDelimited = [string[]]@('M_d_yyyy','M_dd_yyyy','MM_d_yyyy','MM_dd_yyyy','M_d_yy','M_dd_yy','MM_d_yy','MM_dd_yy'
                               ,'M/d/yyyy','M/dd/yyyy','MM/d/yyyy','MM/dd/yyyy','M/d/yy','M/dd/yy','MM/d/yy','MM/dd/yy'
                               ,'M-d-yyyy','M-dd-yyyy','MM-d-yyyy','MM-dd-yyyy','M-d-yy','M-dd-yy','MM-d-yy','MM-dd-yy'
                               ,'M.d.yyyy','M.dd.yyyy','MM.d.yyyy','MM.dd.yyyy','M.d.yy','M.dd.yy','MM.d.yy','MM.dd.yy'
                               ,'month dd, yyyy')

@(
  'January 21, 2019'
  '05_11_2022'
  'NULL'
  '6/15/2020 6/16/2020'
  '7/'
  '09.01.2022'
  '02262021'
  '05/04/2021'
  'ES'
  '10/11'
  '10/15'
  '03/202022'
  '10202022'
  'Last week'
  '10/06//2022'
  '3/8/22'
  'July 28, 2022'
  'August 20, 2022'
) | 
ForEach-Object {
    # 日期变量
    [datetime]$dt = New-Object DateTime

    # 检查目录名是否能解析为DateTime类型
    if ([DateTime]::TryParseExact($_, $formatsDelimited,
                                [System.Globalization.CultureInfo]::InvariantCulture,
                                [System.Globalization.DateTimeStyles]::None,
                                [ref]$dt))
    {
        $_
    } else {
        Write-Warning "无法识别的时间戳: $_"
    }

}
实际输出
警告: 无法识别的时间戳: January 21, 2019
05_11_2022
警告: 无法识别的时间戳: NULL
警告: 无法识别的时间戳: 6/15/2020 6/16/2020
警告: 无法识别的时间戳: 7/
09.01.2022
警告: 无法识别的时间戳: 02262021
05/04/2021
警告: 无法识别的时间戳: ES
警告: 无法识别的时间戳: 10/11
警告: 无法识别的时间戳: 10/15
警告: 无法识别的时间戳: 03/202022
警告: 无法识别的时间戳: 10202022
警告: 无法识别的时间戳: Last week
警告: 无法识别的时间戳: 10/06//2022
3/8/22
警告: 无法识别的时间戳: July 28, 2022
警告: 无法识别的时间戳: August 20, 2022
解决方案

问题出在你使用的日期格式字符串错误:.NET的DateTime.TryParseExact方法不识别month作为格式说明符,正确的格式符应该是MMMM,用来匹配完整的英文月份名称(如January、August)。

修改$formatsDelimited数组中的最后一项,将'month dd, yyyy'替换为'MMMM dd, yyyy'即可解决问题:

$formatsDelimited = [string[]]@('M_d_yyyy','M_dd_yyyy','MM_d_yyyy','MM_dd_yyyy','M_d_yy','M_dd_yy','MM_d_yy','MM_dd_yy'
                               ,'M/d/yyyy','M/dd/yyyy','MM/d/yyyy','MM/dd/yyyy','M/d/yy','M/dd/yy','MM/d/yy','MM/dd/yy'
                               ,'M-d-yyyy','M-dd-yyyy','MM-d-yyyy','MM-dd-yyyy','M-d-yy','M-dd-yy','MM-d-yy','MM-dd-yy'
                               ,'M.d.yyyy','M.dd.yyyy','MM.d.yyyy','MM.dd.yyyy','M.d.yy','M.dd.yy','MM.d.yy','MM.dd.yy'
                               ,'MMMM dd, yyyy') # 这里修改为正确的格式符

修改后重新运行脚本,January 21, 2019、July 28, 2022、August 20, 2022这类日期就能被正确识别,不会再触发警告。

内容的提问来源于stack exchange,提问作者Code Novice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:53:27