如何将包含 monthname 的日期字符串转换为 datetime?

how do you convert a date string that contains a monthname to a datetime?

提问人:back_ache 提问时间:2/23/2023 最后编辑:mklement0back_ache 更新时间:7/25/2023 访问量:142

问:

我确信这很简单,但搜索引擎引导我回答了除此以外的所有问题:-(

我有一个字符串“13 February 2023 13:45:40”,我需要将其转换为日期时间,以便我可以进行比较

你是怎么选择这样的约会的?它是否需要一个比我使用 parseextract 或正则表达式更聪明的专业模块?

谢谢哦,聪明的人

PowerShell 格式 日期时间分析

评论

1赞 stackprotector 2/23/2023
就这么简单:Get-Date "13 February 2023 13:45:40"
1赞 js2010 2/23/2023
[datetime]"13 February 2023 13:45:40"

答:

2赞 Mathias R. Jessen 2/23/2023 #1

完整月份名称的日期格式说明符是 ,将其与 :MMMM[datetime]::ParseExact()

$dateString   = "13 February 2023 13:45:40"
$formatString = 'dd MMMM yyyy HH:mm:ss'
$cultureInfo  = [cultureinfo]::GetCultureInfo('en-US')

[datetime]::ParseExact($dateString, $formatString, $cultureInfo)

如果需要分析其他语言中的时间戳,请替换为相应的区域性标识符:en-US

$dateString   = "13 février 2023 13:45:40"
$formatString = 'dd MMMM yyyy HH:mm:ss'
$cultureInfo  = [cultureinfo]::GetCultureInfo('fr-FR')

[datetime]::ParseExact($dateString, $formatString, $cultureInfo)
2赞 mklement0 2/23/2023 #2
  • 13 February 2023 13:45:40使用一种字符串格式,该格式固定区域性直接识别为标准格式(一种用于编程用途的不可变区域性,基于区域性,但与区域性不同)。[cultureinfo]::InvariantCultureen-US

  • 在 PowerShell 中使用 [datetime] 强制转换始终使用固定区域性,因此,无论当前区域性是什么,都可以安全地使用具有该区域性识别的标准格式的强制转换。

    • 注意:将此类字符串传递给 Get-Date 的参数是安全的,因为它们首先受到当前区域性规则的解释,因为 PowerShell 的参数绑定中不幸的不一致不会被修复,为了向后兼容性 - 请参阅 GitHub 问题 #6989-Date

因此:

[datetime] "13 February 2023 13:45:40"

处理固定区域性无法识别的格式,请执行以下操作:

  • 如果它们是当前/特定区域性识别的标准格式,请使用 [datetime]::P arse()

    • 用于基于当前区域性进行分析。[datetime]::Parse($string)

    • 例如,使用基于给定区域性的解析,例如本例中的 (French, France)。[datetime]::Parse($string, [cultureinfo] 'fr-FR')fr-FR

  • 否则,需要基于传递给 [datetime]::P arseExact() 的自定义格式字符串进行自定义解析,如 Mathias 的有用答案所示。

    • 注意:要基于固定区域性执行自定义解析,请使用
      (sic) 作为参数。
      [cultureinfo] ''provider
  • 上述两种方法还具有 -prefixed variants,它们通过返回值指示是否可以解析,并接受可选参数以接收转换结果。Try[bool][ref]

举几个例子,它们都是等效的:

# The input string.
$dateString = '13 February 2023 13:45:40'

# OK - the [datetime] cast automatically recognizes the format 
# in the context of the *invariant* culture.
[datetime] $dateString

# Ditto, referencing the invariant culture explicitly.
[datetime]::Parse($dateString, [cultureinfo]::InvariantCulture)

# Ditto, with an explicit format string, using [cultureinfo] ''
# as a more concise alternative to [cultureinfo]::InvariantCulture
[datetime]::ParseExact($dateString, 'dd MMMM yyyy HH:mm:ss', [cultureinfo] '')

# .Try*() variants.

# Initialize the result variable.
# For the method-overload resolution below to work as expected,
# be sure to type-constrain it as [datetime].
[datetime] $dtResult = 0

# .TryParse()
$ok = [datetime]::TryParse(
  $dateString, 
  [cultureinfo]::InvariantCulture, 
  [ref] $dtResult
)
# Result
[pscustomobject] @{
  CouldParse = $ok
  Result = $dtresult
}

# .TryParseExact()
$ok = [datetime]::TryParseExact(
  $dateString,
  'dd MMMM yyyy HH:mm:ss', 
  [cultureinfo] '',
  'None',   # [System.Globalization.DateTimeStyle]::None
  [ref] $dtResult
)
# Result
[pscustomobject] @{
  CouldParse = $ok
  Result = $dtresult
}