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'

CreationTimeと はGet-Date逆の日付形式を使用しているようです。これには何らかのロジックがあるのでしょうか、それとも私が何かを見逃しているのでしょうか?

答え1

今やろうとしていることは、文字列(日付)をdatetimeオブジェクト(CreationTimeプロパティ)に直接キャストすることです。

文字列を にキャストする場合datetime、使用できる形式は en-US Culture または ISO 8601 形式 (日本語の日時形式とも呼ばれます) の 2 つだけです。詳細については、次を参照してください。https://stackoverflow.com/questions/14359053/why-does-powershell-always-use-us-culture-when-casting-to-datetime

つまり、次の 3 つの選択肢があります。

  • 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 に使用する場合も同様です。

関連情報