如何在PowerShell中格式化DateTime


155

我可以格式化Get-Datecmdlet像这样没有问题:

$date = Get-Date -format "yyyyMMdd"

但是一旦在变量中获得日期,如何格式化它?以下声明

$dateStr = $date -format "yyyMMdd"

返回此错误:

“必须在'-f'运算符的右侧提供一个值表达式”


3
我实际上希望这种语法有效。$date -format "yyyMMdd"比格式化单个对象更直观'{0:yyyyMMdd}' -f $date
orad

顺便说一句:PowerShell有一个-f运算符(语法如接受的答案所示),但没有-format运算符。该错误消息抱怨ormat不是有效的RHS操作数,但请注意,最新的PowerShell版本实际上发出了另一条更有用的错误消息:Unexpected token '-format' in expression or statement
mklement0

Answers:


221

.NET中的相同:

$DateStr = $Date.ToString("yyyyMMdd")

要么:

$DateStr = '{0:yyyyMMdd}' -f $Date

25

该问题已得到解答,但是缺少更多信息:

变量与Cmdlet

您在$Date变量中有一个值,并且-f运算符确实以这种形式工作:'format string' -f values。如果调用Get-Date -format "yyyyMMdd",则调用带有某些参数的cmdlet。值“ yyyyMMdd”是参数值Format(try help Get-Date -param Format)。

-f 算子

有很多格式字符串。至少看一下part1part2。她用string.Format('format string', values')。可以将其视为'format-string' -f values,因为-f运算符的工作方式与string.Format方法非常相似(尽管存在一些差异(有关更多信息,请参见堆栈溢出问题:PowerShell的-f运算符的RHS 到底如何工作?)。


3
他的意思是-Format参数使Get-DateTime返回一个字符串,而不是DateTime对象。因此,变量$ Date无法再按预期格式设置。我真的希望-Format参数可以简单地更改特定DateTime对象的ToString方法的默认行为。然后它将按您预期的那样工作。
内森·哈特利

19

您可以做的一件事是:

$date.ToString("yyyyMMdd")

谢谢,我这样做了-令我烦恼的是-format无法正常工作。
Ev。

18

一个非常方便的方法-但可能不是效率很高-解决方案是使用成员函数GetDateTimeFormats()

$d = Get-Date
$d.GetDateTimeFormats()

这将为日期值输出一个大的格式样式的字符串数组。然后,您可以通过[]-operator 选择数组的元素之一,例如,

PS C:\> $d.GetDateTimeFormats()[12]
Dienstag, 29. November 2016 19.14

16

一种简单而不错的方法是:

$time = (Get-Date).ToString("yyyy:MM:dd")


2
这是唯一不会对我引发空值表达式错误的方法。谢谢。
Ecker00 '18年

7

如果您绝对需要使用 -Format选项,请执行以下操作:

$dateStr = Get-Date $date -Format "yyyMMdd"

然而

$dateStr = $date.toString('yyyMMdd')

可能更有效.. :)


$dateStr = (Get-Date $date -Format "yyyMMdd")导致对象类型与日期时间对象不同。尝试使用此方法。$dateStr = [datetime](Get-Date $date -Format "yyyMMdd") 您会立即看到差异。
杰米·马歇尔

1
好吧,是的..这是一个字符串,这就是为什么我将其命名为dateStr .. :) OP试图将日期对象格式化为字符串。
tplive


4

我需要时间和格式上的一些细微变化。这对我来说很有效:

$((get-date).ToLocalTime()).ToString("yyyy-MM-dd HHmmss")

2019-08-16 215757

根据@ mklement0中的注释,这应该产生相同的结果:

(get-date).ToString("yyyy-MM-dd HHmmss")


3

对于尝试格式化当前日期以在HTTP标头中使用的任何人,请使用 “ r”格式(RFC1123的缩写),但请注意警告...

PS C:\Users\Me> (get-date).toString("r")
Thu, 16 May 2019 09:20:13 GMT
PS C:\Users\Me> get-date -format r
Thu, 16 May 2019 09:21:01 GMT
PS C:\Users\Me> (get-date).ToUniversalTime().toString("r")
Thu, 16 May 2019 16:21:37 GMT

即不要忘记使用“ ToUniversalTime()”


将其与“ o”一起用于“ xml”样式的日期时间
JohnOpincar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.