Преобразовать формат даты из ДД.ММ.ГГГГ в ГГГГ-ММ-ДД - PullRequest
2 голосов
/ 01 июля 2019

У меня есть папки на диске в немецком формате: «01.05.2019», которые я хочу преобразовать в английский формат: «2019-05-01».

Я использую PowerShell.Есть ли причудливая функция для этого?Или я должен получить все подстроки и изменить их порядок?

В настоящее время я собираю только строки:

$OrgDir = "P:\Fotos\Import"
$folders = Get-ChildItem $($OrgDir) -Directory 
foreach ($dir in $folders) {
    Write-Host "folder: " $dir
}

Ответы [ 2 ]

4 голосов
/ 02 июля 2019

Используйте [DateTime]::ParseExact(), чтобы парсер даты не перепутал месяц и день:

$OrgDir = "P:\Fotos\Import"
$folders = Get-ChildItem $OrgDir -Directory
foreach ($dir in $folders) {
    Write-Host "folder: $([DateTime]::ParseExact($dir.Name, "dd.MM.yyyy", $null).ToString("yyyy-MM-dd"))"
}

Выше распечатаны преобразованные имена. Однако, чтобы эффективно переименовать файлы, я рекомендую следующее:

Get-ChildItem $OrgDir -Directory | 
    ForEach-Object {
        $_ | Rename-Item -NewName (
            [DateTime]::ParseExact($_.Name, "dd.MM.yyyy", $null).ToString("yyyy-MM-dd")
        )
    }

Эта строка PowerShell переименовывает все каталоги в $OrgDir в новый формат даты, учитывая, что все каталоги в папке названы таким образом.

1012 * Ссылка *


UPDATE:

Как отметил @Matt Johnson, $null использует вашу системную культуру по умолчанию для ParseExact(string, format, culture) (а также ToString(format, culture)). Это может вызывать или не вызывать проблемы в зависимости от того, какая культура в вашей системе установлена ​​в данный момент.

Чтобы эти настройки не мешали этой функции, используйте [System.Globalization.CultureInfo]::InvariantCulture для параметров культуры в ParseExact() и ToString().

2 голосов
/ 02 июля 2019

Мэтт Джонсон приводит важные указатели в своих комментариях:

Чтобы написать надежный код, который работает независимо от того, какая культура действует , укажите культуруконтекст явно , когда:

  • синтаксический анализ строк как [datetime] экземпляров

  • форматирование [datetime]экземпляры в виде строк

Следовательно, в вашем случае используйте следующее:

PS> [datetime]::Parse('01.05.2019', [cultureinfo] 'de-DE').
      ToString('yyyy-MM-dd', [cultureinfo]::InvariantCulture)
2019-05-01
  • , поскольку 01.05.2019 является действительным (день первый) короткая дата на немецком языке, пользовательский анализ не требуется, только de-DE (немецкий / Германия) в качестве культурного контекста.

  • .ToString('yyyy-MM-dd', [cultureinfo]::InvariantCulture) указывает явную строку выходного формата;[cultureinfo]::InvariantCulture - инвариантная культура (на основе английского языка США) - поскольку культурный контекст обеспечивает интерпретацию даты на основе григорианского календаря.

Обратите внимание, что в PowerShell приведение (например, [datetime] '01.05.2019') и интерполяция строки (например, "$(get-date)") всегда использование инвариантной культуры - тогда как вызов [datetime]::Parse()и .ToString() без явного аргумента культуры (поставщика формата) использует текущую культуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...