将日期格式从DD.MM.YYYY转换为YYYY-MM-DD

时间:2019-07-01 20:52:04

标签: string powershell date

磁盘上有德语格式的文件夹:“ 01.05.2019”,我想将其转换为英语格式的格式:“ 2019-05-01”。

我正在使用PowerShell。是否有执行此操作的功能?还是应该获取所有子字符串并重新排序?

目前,我只收集字符串:

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

3 个答案:

答案 0 :(得分:4)

使用[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中的所有目录重命名为新的日期格式,假设文件夹中的所有目录都以此方式命名。

Reference


更新:

正如@Matt Johnson指出的那样,$null使用您的系统默认区域性来表示ParseExact(string, format, culture)(以及ToString(format, culture))。根据您的系统当前具有哪种文化设置,这可能会或不会导致问题。

为确保这些设置不会干扰此功能,请在[System.Globalization.CultureInfo]::InvariantCultureParseExact()中将ToString()用作区域性参数。

答案 1 :(得分:2)

Matt Johnson在他的评论中提供了重要的指示:

要编写健壮的代码,使其独立于有效的文化而起作用,,请明确指定文化上下文 ,同时:

  • 将字符串解析为[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()则使用 current 文化。 >

答案 2 :(得分:0)

最后,这对我有用:

PS> [datetime]::Parse('01.05.2019', [cultureinfo] 'de-DE').
      ToString('yyyy-MM-dd', [cultureinfo]::InvariantCulture)

所有其他解决方案均以以下方式结束:

  

Get-Date:无法绑定参数“ Date”。无法将值“ 15.12.2019”转换为类型“ System.DateTime”。错误:“无法将字符串识别为有效的DateTime。”

非常感谢mklement0。