7

現在、テキスト ファイルからさまざまなデータを読み取り、すべてを解析しています。解析される項目の 1 つは、次の形式のイベントの開始時刻です。

yyMMddHHmm
1306050232 

次に、次のように解析します。

string year = "20" + time[0].ToString() + time[1].ToString();
string month = time[2].ToString() + time[3].ToString();
string day = time[4].ToString() + time[5].ToString();
string hour = time[6].ToString() + time[7].ToString();
string minute = time[8].ToString() + time[9].ToString();
string ampm ="";
int hourInt = Convert.ToInt32(hour);

if (hourInt <= 12)
{
    time = month + "." + day + "." + year + "@" + hour + ":" + minute + " " + "AM";
    ampm= "AM";                         
}
else
{
    hourInt = hourInt - 12;      
    time = month + "." + day + "." + year + "@" + hourInt.ToString() + ":" + minute + " " + "PM";
    ampm= "PM";  
}

これらが解析されたら、変数を組み合わせて、DateTime に入れようとします。

string tempStartTime = year + "-" + month + "-" + day + " " + hour + ":" + minute + " " + ampm;

string starttime = DateTime.ParseExact(tempStartTime, "yyyy-MM-dd HH:mm tt",null);

私の問題は、try catch から次のような警告が表示されることです。

System.FormatException: String was not recognized as a valid DateTime.
   at System.DateTime.ParseExact(String s, String format, IFormatProvider provider)
   at Project.GUI.parseSchedule(Int32 count) 

理由、またはこれを正しく行う方法がわかりません。

私が望むのは、ファイルから開始時刻を取得し、それを日時オブジェクトに変換し、後で操作することだけです。

4

4 に答える 4

15

開始している形式で単純に解析してみませんか?

var dt = DateTime.ParseExact(time, "yyMMddHHmm", CultureInfo.InvariantCulture);

行っているすべての前処理は必要ありません。

于 2013-06-05T01:35:56.623 に答える
4

解析する前に解析することは、一般的にまったく不要です。入力文字列がある場合

//                        yyMMddHHmm
string timestampString = "1306050232";

次に、次のことができるはずです。

CultureInfo provider = CultureInfo.InvariantCulture;
DateTime timestamp = DateTime.ParseExact(timeStampString, "yyMMddHHmm", provider);

そうでない場合は、発生している正確なエラーに関する詳細情報を入手したいと思います。

于 2013-06-05T01:36:22.190 に答える
1

すべてを解析しようとするのではなく、カスタム フォーマッタを調べることをお勧めします。これにより、コードがより保守しやすくなり、おそらくデコードが多少簡単になると思います。そのページには、フォーマット文字列をコードに入れる前にテストできるツールがリンクされています。

于 2013-06-05T01:37:11.207 に答える