【问题标题】:c# substring Error - StartIndex cannot be less than zeroc# substring Error - StartIndex 不能小于零
【发布时间】:2015-05-07 13:46:27
【问题描述】:

我有一个名为 value 的字符串 1899-12-30 01:30:00

我想将 01:30 变成一个单独的字符串,我尝试使用子字符串,但它一直给我一个错误,即 startindex 不能小于零,有人能告诉我我做错了什么吗?

using (OleDbDataAdapter oda = new OleDbDataAdapter("SELECT * FROM [" + sheet1 + "]", excel_con))
            {
                oda.Fill(dtExcelData);

            }
            excel_con.Close();


            if (dtExcelData.Rows.Count > 0)
            {

                foreach (DataRow rw in dtExcelData.Rows)
                {
                    //Creates StaffID
                     rw["StaffID"] = "00" + rw["Host Key of Staff"].ToString();

                    //Get duration out of DateTime
                     string Value = rw["Taught Periods Distinct as duration"].ToString();
                     string Duration = Value.Substring(Value.Length - 10, 5);

                     rw["Taught Periods Distinct as duration"] = Duration.ToString();
                }
            }

调试它说:

持续时间 = "01:30" 类型字符串
值 = "30/12/1989 01:30:00" 类型字符串
Value.Length = 19 类型 int
rw["Taught period as distinct as duration"] = "30/12/1989 01:30:00" Type object {string}

【问题讨论】:

  • 你确定Value 是什么。该错误表明它的长度小于 10。
  • 你确定吗,值包含1899-12-30 01:30:00
  • 你确定 Value 有那个值吗?
  • rw["Taught Periods Distinct as duration"] 不是 DateTime 吗?也许您可以将其转换为 DateTime 并完成它?而且,这个消息非常明显 - Value.Length - 10 必须加起来小于零 - Value 似乎不包含您认为它包含的字符串。
  • 什么是rw["..."]?你确定Value 的值是1899-12-30 01:30:00 吗?你能显示那个代码吗?

标签: c# substring


【解决方案1】:

先加个断点,看看Value的值,你的变量好像有无效值。

要将01:30 提取到单独的字符串中,更好的方法 是使用DateTime 解析。因为您的字符串是有效的 DateTime 值。使用

DateTime parsedDateTime;
string Duration = null;
if (!DateTime.TryParseExact("1899-12-30 01:30:00", //or rw["Taught Periods Distinct as duration"].ToString();
    "yyyy-MM-dd HH:mm:ss",
    CultureInfo.InvariantCulture,
    DateTimeStyles.None,
    out parsedDateTime))
{
    Console.WriteLine("Invalid date");
}
else
{
    Duration = parsedDateTime.ToString("HH:mm", CultureInfo.InvariantCulture);
}

【讨论】:

  • 解析到 DateTime 绝对是比子字符串更好的方法。通过这样做,您可以使用 parsedDateTime.Minute、parsedDateTime.Second...
  • 当我取消注释 rw["Taught Periods Distinct as duration"] 时,我无法让它工作
  • 不需要所有的解析和转换。 Excel 直接以本机数据格式存储日期和时间,因此您可以直接访问日期和时间组件,而无需将它们转换为字符串。这只会导致问题(比如不同的区域设置)[I never downvote]
【解决方案2】:

实际上,您想从日期中提取时间(小时 + 分钟)。

为此,我建议不要进行字符串转换。相反,最好使用更直接的方法,直接使用DateTime,如下所示:

DateTime Value = rw["Taught Periods Distinct as duration"];
rw["Taught Periods Distinct as duration"] = Value.TimeOfDay ;

【讨论】:

    【解决方案3】:

    这行得通:

    string Value = "Taught Periods Distinct as duration".ToString();
    string Duration = Value.Substring(Value.Length - 10, 5);
    

    还有:

    string Value2 = "1899-12-30 01:30:00";
    string Duration2 = Value2.Substring(Value2.Length - 10, 5);
    

    【讨论】:

    • OP 没有尝试从该字符串中获取子字符串。他们使用它作为索引来获取他们想要的子字符串的另一个值。
    • "Taught Periods Distinct as duration" 显然是某种集合的索引器。这不是 OP 试图从中提取时间的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多