You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#字符串转DateTime报错及Convert与ParseExact差异咨询

问题分析与解决方案

嘿,我来帮你搞定这个问题!

为什么会出现"String was not recognized as a valid DateTime"错误?

你的代码报错的核心原因是**Convert.ToDateTime默认依赖当前线程的文化设置解析日期字符串**。如果你的系统区域格式不是美式的MM/dd/yyyy(比如中文系统常用yyyy/MM/dd或dd/MM/yyyy),那么"5/15/2018"会被系统误解:它会把15当成月份,而月份的范围是1-12,这显然不符合规则,所以就抛出了无效DateTime的错误。

怎么解决这个问题?

有两种可靠的解决方式:

方式1:指定解析时的文化信息

你可以手动指定使用美式英语文化或者不变文化(InvariantCulture),让解析器按照美式日期格式来处理字符串:

// 使用美式英语文化
DateTime dt = Convert.ToDateTime("5/15/2018 11:54:18 AM", new System.Globalization.CultureInfo("en-US"));
// 或者使用不变文化(默认采用美式日期格式)
DateTime dt = Convert.ToDateTime("5/15/2018 11:54:18 AM", System.Globalization.CultureInfo.InvariantCulture);
string date = dt.ToString("HH:mm");

方式2:使用DateTime.ParseExact精确匹配格式

这种方式更稳妥,你直接指定输入字符串的精确格式,完全规避文化差异带来的问题:

// 格式字符串完全匹配输入的"MM/dd/yyyy hh:mm:ss tt"格式
DateTime dt = DateTime.ParseExact("5/15/2018 11:54:18 AM", "M/d/yyyy hh:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture);
string date = dt.ToString("HH:mm");

这里的格式说明:M表示单数字月份(比如5而不是05),d表示单数字日期,hh是12小时制的小时,tt表示AM/PM标识。


Convert.ToDateTime和DateTime.ParseExact()的区别

我给你整理了两者的核心差异:

  • Convert.ToDateTime:

    • 是通用转换方法,支持将多种类型(int、DateTimeOffset等)转换成DateTime,不只是字符串。
    • 解析字符串时默认用当前线程的文化,也可手动指定文化。
    • 解析规则宽松,能识别多种常见日期格式(取决于文化),但遇到非标准格式或文化不匹配时容易出错。
    • 适合不确定输入格式,但能确定输入符合当前系统文化的场景。
  • DateTime.ParseExact():

    • 专门用于解析字符串,必须指定精确的格式字符串(或多种格式)来匹配输入。
    • 解析规则严格,只有输入和指定格式完全匹配才会成功,否则抛出异常。
    • 可以指定文化信息,完全控制解析逻辑。
    • 适合明确知道输入日期格式的场景,是处理固定格式日期的首选,能最大程度避免解析错误。

内容的提问来源于stack exchange,提问作者Mohammad Daliri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:15:53