PowerShell,為什麼 CreationTime 需要美國日期格式,而係統具有歐洲日期格式?

PowerShell,為什麼 CreationTime 需要美國日期格式,而係統具有歐洲日期格式?

我已經將我的舊 VHS 磁帶數位化,現在它是許多單獨的文件。我想將歸檔日期設定為事件的“原始”日期,以便我可以按時間順序對它們進行排序。

CreationTime這可以透過 PowerShell 使用和來完成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,也會發生相同的情況。

相關內容