【问题标题】:DateTime.TryParseExact() fails because of thread's culture infoDateTime.TryParseExact() 由于线程的文化信息而失败
【发布时间】:2012-01-11 14:25:27
【问题描述】:

我在现有实现中有以下代码行

DateTime.TryParseExact(
    "15/11/2021 00:00:00", 
    "dd/MM/yyyy HH:mm:ss",
    null,
    DateTimeStyles.None,
    out maturityDate);

返回false,表示无法解析传递的字符串。这对我来说真的很令人惊讶,因为这里的模式似乎是准确的。根据 MSDN null 第三个参数中的值意味着将使用当前的文化信息(我假设它是Thread.CurrentThread.CurrentCulture)。

监视窗口中的Thread.CurrentThread.CurrentCultureen-US,但文化信息的实例后来在代码中的某处被更改(日期时间格式化程序或其他东西)。

当我通过CultureInfo.InvariantCulturenew CultureInfo("en-US") 时,一切正常。

null 被传递时,谁能在这里说出导致TryParseExact 失败的原因?类似的问题没有给我任何线索。

【问题讨论】:

  • 你能用DateTime.TryParse(string, out DateTime)吗?

标签: c# .net datetime-format datetime-parsing


【解决方案1】:

如果您传递null,则将使用CurrentCulture

来自TryParseExact 的 MSDN 文档:

如果 provider 为 Nothing,则使用与当前文化对应的 CultureInfo 对象。

这意味着如果当前区域性使用的日期/时间分隔符与您的字符串不同,则解析将失败。

【讨论】:

  • 这是否意味着当前区域性的日期/时间分隔符比我的格式字符串(第二个参数)中的相同分隔符具有更高的优先级?
  • @xenn_33 - 否。这意味着在格式字符串中,/: 被解释为“当前区域性日期/时间分隔符”。它们不是字面的。
【解决方案2】:

15/11/2021 不是有效的美国日期格式。 2021 年 11 月 15 日是。我认为你想要的文化是en-GB

【讨论】:

  • 我只想弄清楚代码出了什么问题。顺便说一句,通过 new CultureInfor("en-US") 是成功的。结果是 11/15/2021 12:00:00 AM
猜你喜欢
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多