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
相关产品推荐
相关产品推荐

