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

C#将URL获取的日期字符串转DateTime时出现输入字符串格式不正确报错如何解决

报错根因与解决办法

你遇到的格式错误核心来自两个问题:

  1. 输入的日期字符串本身存在逻辑冲突:2021/05/03 14:54:14 PM中,24小时制的小时数14和午别标识PM不兼容,PM仅适用于12小时制的时间格式
  2. Convert.ToDateTime默认使用当前系统的区域文化规则解析,兼容性低,很容易因为格式、文化规则不匹配抛出异常

排查步骤

  • 先确认输入日期字符串的生成规则:明确URL传参的日期是12小时制还是24小时制,示例中的14:54:14是24小时制写法,不需要后缀PM
  • 确认解析时使用的区域文化:不同文化的日期分隔符、午别标识、年月日顺序都有差异,默认解析方法受当前运行环境的文化配置影响,跨环境运行时极易失败
  • 优先使用带格式声明的安全解析方法,替代容错性低的Convert.ToDateTime

解决办法

方案1:修正输入字符串(优先选择)

如果可以调整URL传参的生成逻辑,移除冗余的PM标识,或者把24小时制改为12小时制,比如把输入修正为2021/05/03 14:54:14或者2021/05/03 02:54:14 PM,之后用指定格式的方法解析:

using System.Globalization;

string time = expiredorno;
// 明确指定输入格式和不变文化,避免区域文化差异导致的解析失败
bool parseSuccess = DateTime.TryParseExact(time, 
    "yyyy/MM/dd HH:mm:ss", 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.None, 
    out DateTime result);
if (parseSuccess)
{
    string timeleft = result.ToString("dd/MM/yyyy HH:mm:ss tt", CultureInfo.CurrentCulture);
}
else
{
    // 自定义解析失败的兜底逻辑,比如返回参数错误提示、设置默认时间
}

方案2:兼容现有错误输入(无法调整传参时使用)

如果不能修改URL的传参逻辑,先预处理字符串,移除冲突的午别标识之后再解析:

using System.Globalization;

string time = expiredorno.Replace(" AM", "").Replace(" PM", "");
bool parseSuccess = DateTime.TryParseExact(time, 
    "yyyy/MM/dd HH:mm:ss", 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.None, 
    out DateTime result);
if (parseSuccess)
{
    string timeleft = result.ToString("dd/MM/yyyy HH:mm:ss tt", CultureInfo.CurrentCulture);
}

内容的提问来源于stack exchange,提问作者farhang hapooli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 19:03:02