PowerShell中基于区域文化的时间变量格式化问题求助
解决PowerShell中基于区域文化格式化时间变量的问题
首先得点出你代码里的核心问题:-f格式化运算符不能直接用DateTimeFormat里的自定义格式字符串,而且你用-f的顺序也搞反了——-f是格式字符串在前、要格式化的对象在后,但就算顺序对了,它也不识别FullDateTimePattern这种自定义格式,这就是为什么后两个输出都是默认格式的原因。
正确的实现方式:用DateTime.ToString()方法
要基于区域文化格式化时间变量,应该用.NET DateTime对象的ToString()方法,它支持两种常用场景:
- 传入指定区域的
CultureInfo,直接使用该区域的默认格式 - 传入从
DateTimeFormat获取的自定义格式字符串,再结合指定文化(可选)
示例1:使用当前文化的FullDateTimePattern
$time = Get-Date # 获取当前文化的完整日期时间格式 $pattern = (Get-Culture).DateTimeFormat.FullDateTimePattern # 用ToString方法格式化 $formattedTime = $time.ToString($pattern) Write-Host $formattedTime
示例2:用法语(fr-FR)文化的FullDateTimePattern
$time = Get-Date $culture = New-Object System.Globalization.CultureInfo('fr-FR') # 方式1:获取法语文化的完整日期时间格式后格式化 $pattern = $culture.DateTimeFormat.FullDateTimePattern $formattedTime = $time.ToString($pattern, $culture) # 方式2:用标准格式符更简洁('F'对应FullDateTimePattern) $formattedTime = $time.ToString('F', $culture) Write-Host $formattedTime
这里补充下:.NET有标准格式符,比如'F'对应FullDateTimePattern,'D'对应LongDatePattern,'T'对应LongTimePattern,用这些符的话代码会更简洁。
关于你后来尝试的代码错误
你之前写的longDateTimePattern是不存在的属性,正确的属性名是FullDateTimePattern(完整日期时间)、LongDatePattern(长日期)、LongTimePattern(长时间)这类,注意属性名是PascalCase(首字母大写),不过PowerShell对大小写不敏感,但最好和.NET属性名保持一致避免混淆。
对用户提供的模式名称进行校验
如果模式名是用户输入的,你需要先校验它是不是DateTimeFormatInfo里的有效属性,比如可以这样做:
function Test-DateTimePattern { param( [string]$PatternName ) # 获取DateTimeFormatInfo中所有格式相关的字符串属性 $validPatterns = (Get-Culture).DateTimeFormat | Get-Member -MemberType Property | Where-Object { $_.Definition -match 'string' -and $_.Name -like '*Pattern' } | Select-Object -ExpandProperty Name return $PatternName -in $validPatterns } # 测试示例 Test-DateTimePattern -PatternName 'FullDateTimePattern' # 返回True Test-DateTimePattern -PatternName 'longDateTimePattern' # 返回False
这样就能提前判断用户输入的模式名是否有效,避免出现属性不存在的错误。
按照上面的方法修改后,你就能得到期望的输出:
July 9, 2019 11:26:46 AM July 9, 2019 11:26:46 AM mardi 9 juillet 2019 11:26:46
内容的提问来源于stack exchange,提问作者Gordon
相关产品推荐
相关产品推荐

