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

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------ 
}

当前遇到的问题

  1. 无法将此类字符串转换为DateTime,报错:"String 'Oct/26/12:07:33' was not recognized as a valid DateTime."
  2. 是否有更简便的方法比较字符串并找出最接近的时间差?

测试代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:10:21