基于文化的时间变量格式

时间:2019-07-09 09:25:42

标签: powershell

在此示例中,我似乎前两个输出应匹配,从而使我可以根据定义的区域性进行格式化。最后一个应该不同,因为法语格式不同。相反,最后两个相同,并且都获得某种默认格式。因此,当时间是变量时如何处理基于文化的格式化,而不是直接使用Get-Date格式化?看起来应该一样,但事实并非如此。

get-date -format ((Get-Culture).DateTimeFormat.FullDateTimePattern)

$time = Get-Date
$pattern = 'FullDateTimePattern'
$formattedTime = $time -f (Get-Culture).DateTimeFormat.$pattern
Write-Host "$formattedTime"

$culture = New-Object system.globalization.cultureinfo('fr-FR') 
$formattedTime = $time -f ($culture).DateTimeFormat.$pattern
Write-Host "$formattedTime"

我得到的输出是

July 9, 2019 11:22:01 AM
07/09/2019 11:22:01
07/09/2019 11:22:01

我想得到的是

July 9, 2019 11:26:46 AM
July 9, 2019 11:26:46 AM                 
Tuesday 9 July 2019 11:26:46 

编辑:因此,根据I.T Delinquent的回应,我尝试了

$pattern = 'longDateTimePattern'
$date = Get-Date

$format = (Get-Culture).DateTimeFormat.$pattern
$string = ($date).ToString($format)
Write-Host $string

$culture = New-Object system.globalization.cultureinfo('de-DE')
$format = $culture.DateTimeFormat.$pattern
$string = ($date).ToString($format)
Write-Host $string

它给了我相同的结果。因为它不是'longDateTimePattern',所以它的是'longDatePattern'。鉴于该模式可以成为用户提供的字符串,所以我最好对其进行验证。

2 个答案:

答案 0 :(得分:2)

您尝试使用-f运算符是有缺陷的(请参阅底部)。

要获得所需的输出,请使用[datetime]类型的适当.ToString()重载:

$time.ToString($culture.DateTimeFormat.$pattern, $culture)

$culture作为第二个参数传递可确保在该区域性环境中应用格式设置。

如果您的意图是真正使用其他文化的格式并将其应用于当前文化的背景,则只需省略第二个参数(您问题中的Get-Date -Format方法)

$time.ToString($culture.DateTimeFormat.$pattern)

如果不需要涉及不同的文化,则通过standard date-time format strings可以使任务变得更加简单,其中"D"之类的单字符字符串指的是{{{ 1}}:

LongDatePattern

您还可以将这些字符串传递给$time.ToString("D")

Get-Date -Format

关于您尝试过的事情

为了使Get-Date -Format D 运算符正常工作,您的LHS必须是带有 placeholders (第一个-f的字符串 template {0},第二个,...),将被RHS操作数替换。

使用一个简单的示例:

{1}

因此,Format the RHS, an [int], as a number with 2 decimal places. PS> '{0:N2}' -f 1 1.00 根本不执行(显式)格式化,因为LHS-$time -f (Get-Culture).DateTimeFormat.$pattern-不包含占位符。

也就是说,RHS被忽略,而LHS作为字符串返回 :实际上与在以下情况下调用$time相同: 不变文化(因为应用$time.ToString()运算符的结果始终是 string PowerShell uses the invariant culture in many string-related contexts)。

可以将特定的日期时间格式字符串合并到模板字符串占位符中-通过在占位符索引后加上-f和格式字符串,如上所示({{ 1}})-您也无法为其提供文化背景

您必须(暂时)首先切换到所需的文化:

:

答案 1 :(得分:-1)

我认为这与使用变量传递Get-Date的方式有关,它似乎失去了格式功能。实际上,如果您尝试使用Write-Host ($date -Format $format)会出现错误:

  

表达式或语句中出现意外的标记'$ format'

这是我的设置变量:

$pattern = 'FullDateTimePattern'
$format = (Get-Culture).DateTimeFormat.$pattern
$date = Get-Date

如上所述,使用Write-Host ($date -f $format)并错误地输出07/09/2019 12:24:38。但是,使用以下任何选项都可以,并且可以正确输出09 July 2019 12:24:38

Write-Host (Get-Date -Format $format)
Write-Host (Get-Date).ToString($format)
Write-Host ($date).ToString($format)

希望这会有所帮助:)