【问题标题】:String was not recognized as a valid DateTime when parse exactparseexact 时,字符串未被识别为有效的 DateTime
【发布时间】:2013-01-28 19:07:36
【问题描述】:

转换为 DateTime 时出现以下异常:

String was not recognized as a valid DateTime.

lbl_RequestDate.Text = "13/2/2013";

CultureInfo provider = CultureInfo.CurrentCulture;
string[] format = provider.DateTimeFormat.GetAllDateTimePatterns();
Follow.RequestDate = DateTime.ParseExact(lbl_RequestDate.Text, format, provider, DateTimeStyles.None);

【问题讨论】:

  • Follow.RequestDate 的类型是什么?你在追求什么文化? MM/DD/YYYY 有效吗?
  • CurrentCulture (provider) 什么?在某些文化中,日期分隔符字符串不同于 "/"

标签: c# asp.net string datetime cultureinfo


【解决方案1】:

您可以使用d/M/yyyy 的格式,请注意用于月份的单个M

Follow.RequestDate = DateTime.ParseExact(lbl_RequestDate.Text, "d/M/yyyy", provider, DateTimeStyles.None);

方法:provider.DateTimeFormat.GetAllDateTimePatterns() 返回几乎 155 种格式,但它们都不支持 (从您当前的文化看来) 支持格式 d/M/yyyy,这就是您遇到异常的原因。如果您的日期的月份为13/02/2013,则该方法返回的格式将起作用,因为最接近的格式是格式数组中的dd/MM/yyyy

【讨论】:

  • 你:它们都不支持格式d/M/yyyy 嗯,这在很大程度上取决于提供者。例如en-SG(英语(新加坡))、pt-BR(葡萄牙语(巴西))、el-GR(希腊语(希腊))等等,请支持"d/M/yyyy"
【解决方案2】:

也许这会有所帮助:

DateTime.ParseExact("13/2/2013","d/M/yyyy",CultureInfo.GetCultureInfo("en-US"), DateTimeStyles.None );

注意:

d is for Day  (01 is also acceptable)
M is for Month (11 is also acceptable) 

【讨论】:

  • 我很高兴知道为什么会投反对票。虽然它是正确的。
  • 可能是因为您在方法中直接写入了“13/2/2013”​​?我不知道,但它是正确的。 +1
  • 为什么要使用en-US 文化?仅仅因为它恰好与问题中提出的日期格式相匹配?对我来说,其他答案更好。
  • @DanielKelley "13/2/2013"en-US 日期格式不匹配。这里的 en-Us 也是可以接受的。只需更改顺序 - 这就是 parseExact 存在的原因。
  • @JeppeStigNielsen 我想我们同意了。我的问题是在似乎没有必要时包含特定的文化——尤其是考虑到其他答案。
【解决方案3】:

试试这样:

Follow.RequestDate = DateTime.ParseExact(lbl_RequestDate.Text, "d/M/yyyy", CultureInfo.InvariantCulture);

【讨论】:

  • 大多数时候,当你想要单身M时,你也想要单身d,所以:"d/M/yyyy"
【解决方案4】:

DateTimeFormatInfo.GetAllDateTimePatterns() 方法在我的机器上返回(tr-TRCulture)29 格式,但这些都不支持d/M/yyyy 日期格式,这就是你得到FormatException 的原因。

但在我的文化中,DateSeparator.,所以我无法完全使用 CultureInfo.CurrentCulture 解决这个问题,但是当我使用 Egyptcultureinfo(它写在您的个人资料上)CultureInfo.GetCultureInfo("ar-EG") 此代码可以正常工作;

CultureInfo provider = CultureInfo.GetCultureInfo("ar-EG");
string[] format = provider.DateTimeFormat.GetAllDateTimePatterns();
DateTime d = DateTime.ParseExact("13/02/2013", format, provider, DateTimeStyles.None);

很遗憾您的所有日期时间模式不支持d/M/yyyy 格式。

不幸的是,将此字符串更改为 13/02/2013 并不能解决此问题,因为正如我之前所说,我的所有格式(在 tr-TR 文化中)不支持 @ 987654336@ 格式。

我的谦虚建议在这里,列出你所有的日期时间模式并手动检查你的字符串是否被这种日期时间模式识别格式;

string[] format = provider.DateTimeFormat.GetAllDateTimePatterns();
foreach (var f in format)
{
    ///
}

【讨论】:

  • 当提供者是tr-TR 文化时,DateSeparator 字符串是"."。因此,格式字符串中的任何非转义斜杠(如 "d/M/yyyy" 中的斜杠)都会转换为句点。所以这应该解析:DateTime.ParseExact("13.2.2013", "d/M/yyyy", new CultureInfo("tr-TR"));
  • @JeppeStigNielsen 你是对的。我错过了。将更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 2011-09-12
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
相关资源
最近更新 更多