![PowerShell,为什么 CreationTime 需要美国日期格式,而系统采用的是欧洲日期格式?](https://linux22.com/image/1586015/PowerShell%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%20CreationTime%20%E9%9C%80%E8%A6%81%E7%BE%8E%E5%9B%BD%E6%97%A5%E6%9C%9F%E6%A0%BC%E5%BC%8F%EF%BC%8C%E8%80%8C%E7%B3%BB%E7%BB%9F%E9%87%87%E7%94%A8%E7%9A%84%E6%98%AF%E6%AC%A7%E6%B4%B2%E6%97%A5%E6%9C%9F%E6%A0%BC%E5%BC%8F%EF%BC%9F.png)
我已经将旧的 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'
看起来CreationTime
和Get-Date
使用了相反的日期格式?这背后有什么逻辑吗,还是我遗漏了什么?
答案1
您现在要做的是将字符串(日期)直接转换为对象datetime
(CreationTime
属性)
如果将字符串转换为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,则会发生同样的事情。