ASP.NET Forms中12小时制时间转TimeSpan失败问题求助
解决ASP.NET Forms中12小时制时间转TimeSpan的问题
看起来你遇到的核心问题是带AM/PM标识的12小时制时间字符串无法正确解析为TimeSpan,导致最终组合DateTime时时间部分丢失成00:00。我来帮你梳理下可行的解决方案:
一、问题根源
TimeSpan的默认解析方法(比如TimeSpan.Parse())并不支持识别AM/PM——因为TimeSpan本质是表示"时间段",而非一天中的具体时刻,AM/PM属于DateTime的范畴,直接用它转TimeSpan自然会出错,这就是3:00 AM被解析成00:00的原因。
二、正确的转换思路
我们需要先把带AM/PM的时间字符串解析为DateTime,再提取它的TimeSpan部分,具体步骤如下:
1. 精准解析12小时制时间
假设用户传入的时间格式是h:mm tt(比如3:00 AM),用DateTime.ParseExact或DateTime.TryParseExact指定格式解析,避免默认解析的歧义:
// 用户传入的12小时制时间字符串 string timeStr = "3:00 AM"; // 指定支持12小时制的格式模板 string timeFormat = "h:mm tt"; // 解析为DateTime对象 DateTime timeDateTime = DateTime.ParseExact(timeStr, timeFormat, CultureInfo.InvariantCulture); // 提取对应的TimeSpan TimeSpan timeSpan = timeDateTime.TimeOfDay;
2. 组合日期与时间
拿到正确的TimeSpan后,再和用户选择的日期DateTime组合:
// 用户选择的日期(示例值) DateTime selectedDate = DateTime.Parse("08/03/2018"); // 组合成最终的DateTime DateTime dateResult = selectedDate.Add(timeSpan); // 此时dateResult就是预期的"08/03/2018 03:00:00"
3. 容错性更强的写法
建议用TryParseExact处理异常输入,避免程序崩溃:
string timeStr = "3:00 AM"; string[] possibleFormats = new[] { "h:mm tt", "hh:mm tt" }; // 兼容带/不带前导零的小时格式 if (DateTime.TryParseExact(timeStr, possibleFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime timeDateTime)) { TimeSpan timeSpan = timeDateTime.TimeOfDay; DateTime selectedDate = DateTime.Parse("08/03/2018"); DateTime dateResult = selectedDate.Add(timeSpan); // 处理成功逻辑 } else { // 处理时间格式错误的逻辑,比如提示用户输入正确格式 }
三、额外注意事项
- 如果你的系统默认区域不是英文,必须指定
CultureInfo.InvariantCulture或英文区域(比如new CultureInfo("en-US")),否则AM/PM无法被识别。 - 可以根据实际场景扩展
possibleFormats数组,兼容更多时间输入格式(比如3 AM这种不带分钟的情况)。
内容的提问来源于stack exchange,提问作者CyanideHavik
相关产品推荐
相关产品推荐

