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();

try/catch 句を使用していないように見えるため、単純な Parse の代わりに TryParseExact を最初に使用します。デバッガーを使用して、プログラムが失敗している場所を正確に確認することをお勧めします。

コードの潜在的な失敗の他の例は次のとおりです。

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

double.tryParse を使用する

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

性別が数字ではないことが判明した場合、別の例外がスローされます

等...

于 2012-06-18T18:25:23.060 に答える