2

我在 datetime 类中遇到了一个小问题,我不知道如何解决。

我不知道错误是什么,但我看到故障排除提示显示为

将字符串转换为 DateTime 时,在将每个变量放入 DateTime 对象之前解析字符串以获取日期。确保您的方法参数格式正确。

这是我从程序中提取的一段代码,

public IEnumerable<CONTACT_INFO> GetContactInfo(string tableName)
{
    DataTable dt = GetUserInfo(tableName);
    List<CONTACT_INFO> lst = new List<CONTACT_INFO>();

    foreach (DataRow row in dt.Rows)
    {              
        string sDate = "";
        if(!string.IsNullOrEmpty(row["birthday"].ToString()))
        {
            sDate = row["birthday"].ToString();
        }
        string format = "yyyyMMdd";

        System.Globalization.CultureInfo provider =CultureInfo.InvariantCulture;
        string datetime = DateTime.Now.ToShortDateString();

        if (!string.IsNullOrEmpty(sDate))
        {
            datetime = DateTime.ParseExact(sDate, format, provider).ToShortDateString();
        }

        if (row["companyname"].ToString().CompareTo("companylogo") != 0)
        {
            string profile_time = row["profile_timestamp"].ToString();

            if (!string.IsNullOrEmpty(profile_time))
            {
                CSTimeZone time = new CSTimeZone();
                profile_time = time.FromUnix(Convert.ToDouble(profile_time)).ToShortDateString()+" "+
                                 time.FromUnix(Convert.ToDouble(profile_time)).ToLongTimeString();
             }

             string lastUseNetTime = row["last_used_networktime"].ToString();
             if (!string.IsNullOrEmpty(lastUseNetTime))
             {

                 CSTimeZone time = new CSTimeZone();
                 double sec = Convert.ToDouble(lastUseNetTime) * 60;
                 lastUseNetTime = time.FromUnix(Convert.ToDouble(sec)).ToShortDateString() + " " +
                        time.FromUnix(Convert.ToDouble(sec)).ToLongTimeString();
             }
             string lastOnlineTime = row["lastonline_timestamp"].ToString();
             if (!string.IsNullOrEmpty(lastOnlineTime))
             {
                 CSTimeZone time = new CSTimeZone();
                 lastOnlineTime = time.FromUnix(Convert.ToDouble(lastOnlineTime)).ToShortDateString() + " " +
                        time.FromUnix(Convert.ToDouble(lastOnlineTime)).ToLongTimeString();
             }
             lst.Add(new CONTACT_INFO()
             {
                 gender=Convert.ToInt32(row["gender"].ToString()),
                 timezone=row["timezone"].ToString(),                        
                 fullName = row["fullname"].ToString(),
                 profile_timestamp = profile_time,
                 last_used_networktime = lastUseNetTime,
                 lastonline_timestamp = lastOnlineTime,
                 birthday = string.IsNullOrEmpty(sDate) ? "" : datetime
             });
         }
     }
     return lst;
 }

FromUnix 函数写为

public DateTime FromUnix(double seconds)
{
    DateTime datetime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).ToLocalTime();
    return datetime.AddSeconds(seconds);
}
4

1 回答 1

0

我很确定这是一个解析问题 如果 sDate 的值不是 yyyyMMdd 的定义格式,以下行将引发异常

datetime = DateTime.ParseExact(sDate, format, provider).ToShortDateString();

我会首先使用 TryParseExact 而不是简单的 Parse,因为您似乎没有使用 try/catch 子句。使用调试器准确查看程序失败的位置可能是个好主意。

代码中潜在故障的其他示例是

double sec = Convert.ToDouble(lastUseNetTime) * 60;

使用 double.tryParse

Convert.ToInt32(row["gender"].ToString()

如果性别不是数字,则会抛出另一个异常

ETC...

于 2012-06-18T18:25:23.060 回答