PowerShell, por que o CreationTime espera o formato de data dos EUA enquanto o sistema tem formato de data europeu?

PowerShell, por que o CreationTime espera o formato de data dos EUA enquanto o sistema tem formato de data europeu?

Digitalizei minhas fitas VHS antigas e agora são vários arquivos separados. Quero definir os arquivos como as datas 'originais' dos eventos, para poder classificá-los cronologicamente.

Isso pode ser feito com o PowerShell usando CreationTimee LastWriteTime, mas há algo que não entendo. O formato de data do meu sistema é europeu, então DD-MM-AAAA, mas CreationTimesó aceita o formato de data dos EUA, então MM/DD/AAAA (o mesmo vale para LastWriteTime). Veja o código abaixo, é PS v4.0 aliás.

# 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'

Parece que CreationTimee Get-Dateusa os formatos de data opostos? Existe alguma lógica por trás disso ou estou faltando alguma coisa?

Responder1

O que você está tentando fazer agora é converter uma string (a data) diretamente em um datetimeobjeto (a CreationTimepropriedade)

Se você converter uma string para datetime, poderá usar apenas dois formatos, cultura en-US ou formato ISO 8601 (também conhecido como formato de data e hora japonês). Leia mais sobre isso aqui:https://stackoverflow.com/questions/14359053/why-does-powershell-always-use-us-culture-when-casting-to-datetime

Então você tem três opções agora:

  • Usar formato ISO:(Get-ChildItem oud_en_nieuw_beijum.mpg).CreationTime = "1998-12-31"
  • Use en-US:(Get-ChildItem oud_en_nieuw_beijum.mpg).CreationTime = "12/31/1998"
  • Analisar:(gci oud_en_nieuw_beijum.mpg).CreationTime = ([datetime]::Parse("31.12.1998"))

se você parse()fizer isso, o PowerShell analisará a string, com as informações da sua cultura local, para que possa lidar com o "formato europeu"

se você quiser analisar informações culturais diferentes da sua cultura local, basta criar um [cultureinfo]objeto e analisar a data. por exemplo:

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

Responder2

Eu usei (Get-Item Filename.extension).CreationTime=("6 October 2020 17:47:22") e funciona totalmente.

A mesma coisa se você usar para LastWriteTime e LastAccessTime.

informação relacionada