PowerShell, ¿por qué CreationTime espera un formato de fecha estadounidense mientras que el sistema tiene un formato de fecha europeo?

PowerShell, ¿por qué CreationTime espera un formato de fecha estadounidense mientras que el sistema tiene un formato de fecha europeo?

He digitalizado mis viejas cintas VHS y ahora hay bastantes archivos separados. Quiero establecer las fechas de archivo en las fechas "originales" de los eventos, para poder ordenarlos cronológicamente.

Esto se puede hacer con PowerShell usando CreationTimey LastWriteTime, pero hay algo que no entiendo. El formato de fecha de mi sistema es europeo, por lo que DD-MM-AAAA, pero CreationTimesolo acepta el formato de fecha de EE. UU., por lo que MM/DD/AAAA (lo mismo ocurre con LastWriteTime). Vea el código a continuación, es PS v4.0 por cierto.

# 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 eso CreationTimey Get-Dateusa los formatos de fecha opuestos? ¿Hay alguna lógica detrás de esto o me estoy perdiendo algo?

Respuesta1

Lo que estás intentando hacer ahora es transmitir una cadena (la fecha) directamente a un datetimeobjeto (La CreationTimepropiedad).

Si envía una cadena a datetime, solo puede usar dos formatos: formato en-US Culture o ISO 8601 (también conocido como formato de fecha y hora japonés). Lea mas sobre eso, aqui:https://stackoverflow.com/questions/14359053/why-does-powershell-always-use-us-culture-when-casting-to-datetime

Entonces tienes tres opciones ahora:

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

Si lo parse()hace, PowerShell analizará la cadena con la información de su cultura local, de modo que pueda manejar el "formato europeo".

Si desea analizar información cultural que sea diferente de su cultura local, puede simplemente crear un [cultureinfo]objeto y analizar la fecha. p.ej:

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

Respuesta2

Utilicé (Get-Item Filename.extension).CreationTime=("6 de octubre de 2020 17:47:22") y funciona totalmente.

Lo mismo si lo usas para LastWriteTime y LastAccessTime.

información relacionada