PowerShell,为什么 CreationTime 需要美国日期格式,而系统采用的是欧洲日期格式?

PowerShell,为什么 CreationTime 需要美国日期格式,而系统采用的是欧洲日期格式?

我已经将旧的 VHS 录像带数字化,现在有相当多的独立文件。我想将文件日期设置为事件的“原始”日期,这样我就可以按时间顺序对它们进行排序。

这可以通过 PowerShell 使用CreationTime和 来完成LastWriteTime,但有些事情我不明白。我的系统日期格式是欧洲的,所以是 DD-MM-YYYY,但CreationTime只接受美国日期格式,所以是 MM/DD/YYYY( 也是如此LastWriteTime)。请参阅下面的代码,顺便说一下,它是 PS v4.0。

# This gives error message: Cannot convert value "31-12-1998" to type "System.DateTime"
(Get-ChildItem oud_en_nieuw_beijum.mpg).CreationTime = '31-12-1998'

# This works correctly
(Get-ChildItem oud_en_nieuw_beijum.mpg).CreationTime = '12/31/1998'

# This gives error message: Cannot convert value "12/31/1998" to type "System.DateTime"
Get-Date -Date '12/31/1998'

# This works correctly
Get-Date -Date '31-12-1998'

看起来CreationTimeGet-Date使用了相​​反的日期格式?这背后有什么逻辑吗,还是我遗漏了什么?

答案1

您现在要做的是将字符串(日期)直接转换为对象datetimeCreationTime属性)

如果将字符串转换为datetime,则只能使用两种格式,即 en-US Culture 或 ISO 8601 格式(也称为日语日期时间格式)。在此处阅读更多相关信息:https://stackoverflow.com/questions/14359053/why-does-powershell-always-use-us-culture-when-casting-to-datetime

所以你现在有三个选择:

  • 使用 ISO 格式:(Get-ChildItem oud_en_nieuw_beijum.mpg).CreationTime = "1998-12-31"
  • 使用 en-US:(Get-ChildItem oud_en_nieuw_beijum.mpg).CreationTime = "12/31/1998"
  • 解析:(gci oud_en_nieuw_beijum.mpg).CreationTime = ([datetime]::Parse("31.12.1998"))

如果你parse()这样做,PowerShell 将使用你的本地文化信息解析该字符串,这样它就可以处理“欧洲格式”

如果您想解析与当地文化不同的文化信息,您只需创建一个[cultureinfo]对象并解析日期。例如:

$dateString = '10.12.2018'
$frenchCulture = [cultureinfo]::GetCultureInfo('fr-FR')
# Parsing with French Culture
[datetime]::Parse($dateString, $frenchCulture)

答案2

我使用了 (Get-Item Filename.extension).CreationTime=("6 October 2020 17:47:22") 并且它完全有效。

如果将其用于 LastWriteTime 和 LastAccessTime,则会发生同样的事情。

相关内容