如何在PowerShell中格式化DateTime

Ev.*_*Ev. 138 powershell datetime

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

$date = Get-Date -format "yyyyMMdd"
Run Code Online (Sandbox Code Playgroud)

但是一旦我在变量中得到了一个日期,我该如何格式化呢?以下声明

$dateStr = $date -format "yyyMMdd"
Run Code Online (Sandbox Code Playgroud)

返回此错误:

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

Jos*_*osh 201

与在.NET中一样:

$DateStr = $Date.ToString("yyyyMMdd")
Run Code Online (Sandbox Code Playgroud)

要么:

$DateStr = '{0:yyyyMMdd}' -f $Date
Run Code Online (Sandbox Code Playgroud)

  • 结果是:“您不能对空值表达式调用方法。” (5认同)
  • @Scott,这是错误消息告诉您确实做错了的极少数情况之一。 (4认同)
  • @Langdon - 假设您使用的是 $Date.ToString(...) 形式,那么该错误是因为您的 $Date 变量包含 Null。在调用 ToString 之前,您需要确保实际上已为其分配了 DateTime 值。...第二种形式(使用 -f 运算符)似乎可以容忍空值,并且只会输出一个空字符串。 (2认同)

ste*_*tej 24

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

变量与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方法的工作方式非常相似(尽管存在一些差异(有关更多信息,请参阅Stack Overflow中的问题:PowerShell的-f运算符的RHS 究竟如何工作的?).

  • 他所说的是-Format参数导致Get-DateTime返回一个字符串,而不是DateTime对象.因此,您的变量$ Date无法再按预期格式化.我真的希望-Format参数只是改变特定DateTime对象的ToString方法的默认行为.然后它会像你预期的那样工作. (2认同)

Joh*_*don 19

你能做的一件事是:

$date.ToString("yyyyMMdd")
Run Code Online (Sandbox Code Playgroud)


dav*_*igh 17

一个非常方便 - 但可能不是太有效 - 的解决方案是使用成员函数GetDateTimeFormats(),

$d = Get-Date
$d.GetDateTimeFormats()
Run Code Online (Sandbox Code Playgroud)

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

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


Ste*_*ler 11

一个简单而好的方法是:

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

或者干脆

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

  • 这是唯一没有为我抛出空值表达式错误的方法。谢谢。 (3认同)

tpl*_*ive 7

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

$dateStr = Get-Date $date -Format "yyyMMdd"
Run Code Online (Sandbox Code Playgroud)

然而

$dateStr = $date.toString('yyyMMdd')
Run Code Online (Sandbox Code Playgroud)

可能更有效.. :)


Jar*_*uba 6

如果您在这里使用它cmd.exe(在批处理文件中):

powershell -Command (Get-Date).ToString('yyyy-MM-dd')
Run Code Online (Sandbox Code Playgroud)


Edd*_*mar 5

@stej 提供的信息非常丰富,但这里有一个简短的答案:在其他选项中,您有3 个简单的选项来格式化存储在变量中的 [System.DateTime]:

  1. 将变量传递给Get-Date cmdletGet-Date -Format "HH:mm" $date

  2. 使用toString() 方法$date.ToString("HH:mm")

  3. 使用复合格式"{0:HH:mm}" -f $date


Pet*_*r L 5

对于试图格式化当前日期以用于 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
Run Code Online (Sandbox Code Playgroud)

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


Dev*_*ate 5

我需要时间和格式上的细微变化。这对我的目的很有用:

$((get-date).ToLocalTime()).ToString("yyyy-MM-dd HHmmss")
Run Code Online (Sandbox Code Playgroud)

2019-08-16 215757

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

(get-date).ToString("yyyy-MM-dd HHmmss")
Run Code Online (Sandbox Code Playgroud)