1

私には本当に奇妙に思えるいくつかの問題があり、なぜこれが起こっているのか理解できません。

基本的に、私は DateTime.ParseExact を実行しようとしています。これは、あるケースでは機能するが、他のケースでは機能しない場合です。

この文字列を日付文字列として持っているとしましょう:

"11/02/2015 11:59:06:313"

メソッドに文字列の明示的な宣言、つまり次のコードを指定して解析すると、すべて正常に動作します。

DateTime.ParseExact("11/02/2015 11:59:06:313", "dd/MM/yyyy HH:mm:ss:fff", null);

これを動的な値として配置すると(これが必要です)、次のコードで「有効な DateTime 形式として認識されない文字列」が表示されます。

DateTime.ParseExact(item.original, "dd/MM/yyyy HH:mm:ss:fff", null);

Convert.ToDateTime メソッドも試しました (同じ例外がスローされました)。

Convert.ToDateTime(item.original).ToString("dd/MM/yyyy HH:mm:ss:fff");

「item.original」変数はクラスから取得されます (これは、そのクラスの文字列プロパティであり、次のように定義されます)

public class XmlData
{
    public string tableName { get; set; }
    public string columnName { get; set; }
    public string original { get; set; }
    public int required { get; set; }
    public string status { get; set; }
    public string type { get; set; }
    public string newValue { get; set; }
}

私はここで本当に迷っています。なぜこれが起こっているのか、誰にとっても理にかなっていますか?

編集

問題はさらに背後にある可能性があるため、これがどのように使用されているかについてもう少し情報を提供することにしました。

リフレクションを使用して DataTable を作成するプロパティのみを定義するために使用しているクラスがあります。

クラスには次のプロパティがあります。

public DateTime last_date { get; set; }

次に、このメソッドを使用して DataTable を構築しています。

public DataTable CreateEmptyDataTable(Type myType)
{
    DataTable dt = new DataTable();

    foreach (PropertyInfo info in myType.GetProperties())
    {
        dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
    }

    return dt;
}

DataTable を初期化した後、XmlData クラスから値を読み取り、次のコードを使用して次のように last_date 列に値を代入します。

//Set the original state
foreach (XmlData item in collection)
{
    if (item.tableName == "vehicle")
    {
        if (item.original == "--NULL--")
            dr[item.columnName.Substring(item.tableName.Length + 1)] = DBNull.Value;
        else
        {
            if (item.type == "DT") //DateTime in format "dd/MM/yyyy HH:mm:ss:fff"
                dr[item.columnName.Substring(item.tableName.Length + 1)] = DateTime.ParseExact(item.original, "dd/MM/yyyy HH:mm:ss:FFF", null);
            else
                dr[item.columnName.Substring(item.tableName.Length + 1)] = Convert.ChangeType(item.original, dt.Columns[item.columnName.Substring(item.tableName.Length + 1)].DataType);
        }
    }
}
4

3 に答える 3

4

あなたのフォーマットは正しいです。

nullとして使用しているため、異なる文字または/および異なる文字を持っているIFormatProviderと強く思われます。CurrentCultureDateSeparator/ TimeSeparator:

/および:文字は、カスタムの日付と時刻の解析では特別です。彼らは次のように意味します:現在のカルチャの日付または時刻の区切り記号で置き換えます

あなたのプロフィールには、あなたはポルトガル出身で、現在の文化はおそらくpt-PT. そして、この文化-DateSeparator

于 2015-03-09T11:45:27.523 に答える
3

暗闇の中でのショット:

あなたはハードコードされた値を持っています

DateTime.ParseExact("11/02/2015 11:59:06:313", "dd/MM/yyyy HH:mm:ss:fff", null);

ただし、値を last_date 列に割り当てると、次のようになります。

if (item.type == "DT") //DateTime in format "dd/MM/yyyy HH:mm:ss:fff"
            dr[item.columnName.Substring(item.tableName.Length + 1)] = DateTime.ParseExact(item.original, "dd/MM/yyyy HH:mm:ss:FFF", null);
        else
            dr[item.columnName.Substring(item.tableName.Length + 1)] = Convert.ChangeType(item.original, dt.Columns[item.columnName.Substring(item.tableName.Length + 1)].DataType);

そうであってはならない

DateTime.ParseExact(item.original, "dd/MM/yyyy HH:mm:ss:fff", null);

それ以外の

DateTime.ParseExact(item.original, "dd/MM/yyyy HH:mm:ss:FFF", null);

?

于 2015-03-09T14:11:29.803 に答える
0

誰かが疑問に思っている場合、この問題の「解決策」は、文字列を分解し、次のように DateTime コンストラクターに割り当てることで、DateTime オブジェクトをインスタンス化することでした。

string[] date = item.original.Split(' ');
string[] datePart = date[0].Split('/');
string[] hourPart = date[1].Split(':');

DateTime newDateValue = DateTime.MinValue;

if (hourPart.Length == 3)
{
    newDateValue = new DateTime(Convert.ToInt32(datePart[2]), Convert.ToInt32(datePart[1]), Convert.ToInt32(datePart[0]), Convert.ToInt32(hourPart[0]), Convert.ToInt32(hourPart[1]), Convert.ToInt32(hourPart[2]));
}
if (hourPart.Length == 4)
{
    newDateValue = new DateTime(Convert.ToInt32(datePart[2]), Convert.ToInt32(datePart[1]), Convert.ToInt32(datePart[0]), Convert.ToInt32(hourPart[0]), Convert.ToInt32(hourPart[1]), Convert.ToInt32(hourPart[2]), Convert.ToInt32(hourPart[3]));
}

引用符を付けて「解決策」と言うのは、それは悪い解決策だと思うからです。この操作は比較的重いため、おそらくもっと良い方法があると思いますが、少なくとも機能します

于 2015-03-11T15:17:29.810 に答える