C#字符串日期转换与ListBox时间匹配问题
问题描述
我有三个填充了项目的ListBox,每个项目字符串以类似"Oct 26 12:07:33"的格式开头。点击其中一个ListBox的项目时,另外两个ListBox需要自动选中时间相同或最接近的项目。
现有代码实现思路
我先从ListBox项目中读取时间并拆分字符串:
string line = listBox2.SelectedItem as string; string[] lineSplit = line.Split(" "); string month = (lineSplit[0]); string day = lineSplit[1]; string time = lineSplit[2];
随后计划创建列表存储时间差,时间差最小的行索引即为目标ListBox项目索引,遍历另一个ListBox的代码如下:
List<int> minDiff = new List<int>(); for (int k = 0; k < listBox3.Items.Count; k++) { string listBox3Line = listBox3.Items[k].ToString(); string[] listBox3lineSplit = listBox3Line.Split(" "); string listBox3month = listBox3lineSplit[0]; string listBox3day = listBox3lineSplit[1]; string listBox3time = listBox3lineSplit[2]; // -----Compare------ }
当前遇到的问题
- 无法将此类字符串转换为DateTime,报错:
"String 'Oct/26/12:07:33' was not recognized as a valid DateTime." - 是否有更简便的方法比较字符串并找出最接近的时间差?
测试代码
string month = "Oct"; string day = "26"; string time = "12:07:33"; DateTime enter_date = Convert.ToDateTime("Oct" + "/" + "26" + "/" + "12:07:33"); Console.WriteLine(enter_date); // 报错:"String 'Oct/26/12:07:33' was not recognized as a valid DateTime."
补充:该时间戳来自设备生成的.txt日志文件,无法修改,仅能复制到本地读取。
解决方案
1. 正确转换字符串为DateTime
你拼接的格式"Oct/26/12:07:33"不符合默认的DateTime解析规则,应该使用指定格式的解析方法,比如DateTime.TryParseExact,明确告知解析器字符串的格式:
using System.Globalization; string timeStr = "Oct 26 12:07:33"; DateTime targetTime; // 定义匹配格式:英文月份缩写+空格+日期+空格+24小时制时间 string format = "MMM dd HH:mm:ss"; // 使用InvariantCulture确保月份缩写解析不受系统区域设置影响 if (DateTime.TryParseExact(timeStr, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out targetTime)) { // 解析成功,targetTime即为转换后的DateTime对象 }
2. 更简便的时间差比较方法
无需手动存储所有时间差再找最小值,可在遍历ListBox时实时计算并记录最小差值的索引,减少冗余操作:
using System.Globalization; // 先获取选中项的DateTime(已通过上述方法解析完成) DateTime selectedTime = /* 从选中项解析得到的DateTime */; int closestIndex = -1; TimeSpan minTimeDiff = TimeSpan.MaxValue; for (int k = 0; k < listBox3.Items.Count; k++) { string itemStr = listBox3.Items[k].ToString(); DateTime itemTime; // 直接截取字符串前11位(对应"Oct 26 12:07:33"的长度),避免拆分字符串 if (DateTime.TryParseExact(itemStr.Substring(0, 11), "MMM dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out itemTime)) { // 计算时间差的绝对值 TimeSpan diff = Math.Abs(selectedTime - itemTime); // 更新最小差值及对应索引 if (diff < minTimeDiff) { minTimeDiff = diff; closestIndex = k; } } } // 选中最接近的项目 if (closestIndex != -1) { listBox3.SelectedIndex = closestIndex; }
优化说明
- 直接截取时间字符串片段,省去拆分字符串的繁琐步骤
- 实时更新最小差值和对应索引,无需额外集合存储所有差值
- 用
TryParseExact替代Convert.ToDateTime,避免解析失败时抛出异常,代码更健壮
内容的提问来源于stack exchange,提问作者phibac
相关产品推荐
相关产品推荐

