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

3

我在磁盘上有以德语格式命名的文件夹:“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
[datetime]::Parse("01.05.2019").ToString('yyyy-MM-dd') - JosefZ
2
小心。根据默认的文化设置,这可能被解释为1月5日或5月1日。 - Matt Johnson-Pint
3个回答

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参考链接

更新:

如@Matt Johnson所指出的,$nullParseExact(string, format, culture)(以及ToString(format, culture))中使用您系统默认的区域设置。这可能会根据您系统当前的区域设置而导致问题。
为确保这些设置不会干扰此函数,请在ParseExact()ToString()的区域参数中使用[System.Globalization.CultureInfo]::InvariantCulture

3
FYI,“$null”将使用当前文化。如果当前文化不使用公历系统,则值可能会被解释错误(例如,“ar-SA”默认为“HijriCalendar”)。传递[System.Globalization.CultureInfo] ::InvariantCulture更安全(ToString方法的第二个参数也是如此)。当然,如果脚本从不在具有此类设置的计算机上运行,则无所谓。 - Matt Johnson-Pint

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()则使用当前文化。


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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接