PowerShell, почему CreationTime ожидает американский формат даты, в то время как в системе используется европейский формат даты?

PowerShell, почему CreationTime ожидает американский формат даты, в то время как в системе используется европейский формат даты?

Я оцифровал свои старые VHS-кассеты, и теперь там довольно много отдельных файлов. Я хочу установить даты файлов на «исходные» даты событий, чтобы иметь возможность сортировать их в хронологическом порядке.

Это можно сделать с помощью PowerShell, используя CreationTimeи LastWriteTime, но есть кое-что, чего я не понимаю. Мой системный формат даты — европейский, поэтому ДД-ММ-ГГГГ, но CreationTimeпринимает только американский формат даты, поэтому ММ/ДД/ГГГГ (то же самое касается и 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 октября 2020 17:47:22"), и это полностью работает.

То же самое, если вы используете его для LastWriteTime и LastAccessTime.

Связанный контент