检查字符串是否为TimeSpan

时间:2012-11-20 09:29:23

标签: c# .net

我从Excel文件导入数据,我需要检查我导入的数据是TimeSpan还是常规字符串。因为数据可以是 07:00:00 D2 07:00 。在excel文件中,某些字段的格式为 tt:mm ,但其他字段为纯文本字段。

我的代码如下:

 public void ReadExcelFile()
        {
            string filename = @"C:\Temp\Copy2.xlsx";
            using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""))
            {
                try
                {
                    connection.Open();
                    string sqlCmd1 = "SELECT  * FROM [Sheet1$]";
                    using (OleDbCommand command = new OleDbCommand(sqlCmd1, connection))
                    {
                        command.CommandType = System.Data.CommandType.Text;
                        using (OleDbDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                alias = "" + reader[3];
                                codeT = "" + reader[4];
                                dtTruck = "" + reader[5];
                                codeP = "" + reader[6];
                                dtPlane = "" + reader[7];
                                dtDealer = "" + reader[8];

                                TimeSpan ts;
                                bool TruckisValid = TimeSpan.TryParse(dtTruck, CultureInfo.InvariantCulture, out ts);
                                bool PlaneisValid = TimeSpan.TryParse(dtPlane, out ts);
                                if (TruckisValid )
                                {
                                    truck = TimeSpan.FromDays(Convert.ToDouble(dtTruck));
                                }
                                else if (PlaneisValid)
                                {
                                    plane = TimeSpan.FromDays(Convert.ToDouble(dtPlane));
                                }
                                else
                                {

                                }

                                if (dtTruck == "" && dtPlane == "")
                                {
                                    dtTruck = "";
                                    dtPlane = "";
                                }
                                else if (dtTruck != "")
                                {
                                    truck = TimeSpan.FromDays(Convert.ToDouble(dtTruck));
                                    dtPlane = "";
                                }
                                else if (dtPlane != "")
                                {
                                    plane = TimeSpan.FromDays(Convert.ToDouble(dtPlane));
                                    dtTruck = "";
                                }


                                SearchForAdrIDAndCustID(Convert.ToString(reader[0]), Convert.ToString(reader[3]));
                                InsertData(custID, "" + reader[3], adrID, truck, codeT, plane, codeP, dtDealer);
                            }
                        }
                    }

                }
                catch (Exception exception)
                {
                    Console.WriteLine("ERROR in ReadExcelFile() method. Error Message : " + exception.Message);
                }
            }
        }

正如您所看到的,我试图使用bool来确定导入的字段是否是一个时间跨度。但是布尔总是假的。

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

以下是您问题的相关部分:

TimeSpan ts;
bool TruckisValid = TimeSpan.TryParse(dtTruck, CultureInfo.InvariantCulture, out ts);
bool PlaneisValid = TimeSpan.TryParse(dtPlane, out ts);
if (TruckisValid )
{
    truck = TimeSpan.FromDays(Convert.ToDouble(dtTruck));
}
else if (PlaneisValid)
{
    plane = TimeSpan.FromDays(Convert.ToDouble(dtPlane));
}
else
{

}
  1. 您在两个不同的字段中重复使用相同的TimeSpan变量ts。我假设您只是用它来测试它是否可以被解析。相反,您应该使用已解析的TimeSpan
  2. 您正在测试TimeSpan,但您将其转换为double 。它既可以转换为TimeSpan,也可以转换为两倍。
  3. 所以也许这种方法更好:

    double d;
    TimeSpan ts;
    bool TruckisValidDouble = false;
    bool TruckisValidTimeSpan = TimeSpan.TryParse(dtTruck, CultureInfo.InvariantCulture, out ts);
    if(!TruckisValidTimeSpan)
    {
        TruckisValidDouble = double.TryParse(dtTruck, out d);
    }
    // use approapriate variables
    

    来自评论:

      

    将其转换为double的原因是因为当我导入时   来自我的excel文件的数据,其百分比值为07:00:00女巫   是0,29166666667。所以我将双倍值转换为时间跨度。

    但您无法检查TimeSpan并解析为double,反之亦然。如果您知道TimeSpan通过TryParse直接使用TimeSpan变量。否则double.TryParse并在之后使用该变量。

    例如:

    if(!TruckisValidTimeSpan  && TruckisValidDouble)
    {
        ts = TimeSpan.FromHours(d * 24);
    }
    

答案 1 :(得分:0)

您可以使用正则表达式检查您的值是否为TimeSpan,如下所示:

Regex reg = new Regex("^\d{2}:\d{2}:\d{2}$"); 
bool TruckIsValid = reg.IsMatch(dtTruck);