【问题标题】:Convert date format from DD.MM.YYYY to YYYY-MM-DD将日期格式从 DD.MM.YYYY 转换为 YYYY-MM-DD
【发布时间】:2019-07-01 20:52:04
【问题描述】:

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

我正在使用 PowerShell。这样做有什么花哨的功能吗?还是应该获取所有子字符串并重新排序?

目前我只收集字符串:

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

【问题讨论】:

  • [datetime]::Parse("01.05.2019").ToString('yyyy-MM-dd')
  • 小心。这可以解释为 1 月 5 日或 5 月 1 日,具体取决于默认的文化设置。

标签: string powershell date


【解决方案1】:

使用[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))。根据您的系统当前的文化设置,这可能会也可能不会导致问题。

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

【讨论】:

  • 仅供参考,$null 将使用当前文化。如果当前区域性不使用公历系统,则该值可能会被错误地解释(例如,ar-SA 默认为 HijriCalendar)。通过[System.Globalization.CultureInfo]::InvariantCulture 更安全。 (与ToString 方法的第二个参数相同)。当然,如果脚本从未在具有此类设置的机器上运行,那也没关系。
【解决方案2】:

Matt Johnson 在他的 cmets 中提供了重要的指针:

要编写可靠的代码独立于有效的文化,请在以下情况下明确指定文化上下文

  • 将字符串解析为[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 casts(例如,[datetime] '01.05.2019')和字符串插值(例如,"$(get-date)"总是使用 invariantculture - 而调用 [datetime]::Parse().ToString() 没有明确的文化(格式提供者)参数使用 当前 文化。

【讨论】:

    【解决方案3】:

    最后这对我有用:

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

    所有其他解决方案都以:

    获取日期:无法绑定参数“日期”。无法将值“15.12.2019”转换为类型“System.DateTime”。错误:“字符串未被识别为有效的日期时间。”

    非常感谢 mklement0。

    【讨论】:

      猜你喜欢
      • 2020-01-11
      • 2022-01-25
      • 1970-01-01
      • 2018-03-16
      • 2017-06-24
      • 1970-01-01
      • 2021-12-31
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多