2013-04-19 24 views
8

私は解析する必要のある古いログファイルを持っています - 明らかに日付時間は次のように保存されました: 18/12/2012 11:09:39 p.m. - これらを解析しようとする私の試みはすべて失敗しました。 私はこれで完全に失われています - どんな助けや方向性も素晴らしいでしょう!DateTime.Parseは常に特定のカルチャで例外をスローします

CultureInfo cultureInfo = new CultureInfo("es-MX" , true); 
     string date = "18/12/2012 11:09:39 p.m."; 

     DateTime dt = new DateTime(2012 , 12 , 18 , 11 , 9 , 39).AddHours(12); 

     this.richTextBox1.Text += date + Environment.NewLine; 
     this.richTextBox1.Text += dt.ToString(cultureInfo) + Environment.NewLine; 
     this.richTextBox1.Text += dt.ToString() + Environment.NewLine; 

     foreach (var item in richTextBox1.Lines) 
     { 
      try 
      { 
       DateTime d= DateTime.Parse(item); 
       this.richTextBox1.Text += d.ToString() + Environment.NewLine ; 

      } 
      catch (Exception ee) 
      { 
       this.richTextBox1.Text += ee.Message + Environment.NewLine ; 

      } 
     } 
+1

**トンの常に** ...よく...特定の文化の中で1 – phadaphunk

+1

あなたが右のそれは何で、例外をキャッチしている –

+1

50%。??彼は時間、私のコードは時間の100%動作します。 – Brian

答えて

3

いくつかの日付は、午後または午後に終了する奇妙な書式設定があります。 上記のすべての方法は失敗するようです - そして、私はそれらすべてを試しました:( これは私のハック/問題:

 CultureInfo cultureInfo = new CultureInfo("es-MX" , true); 
    Date = DateTime.Parse(date.Replace("p. m." , "PM").Replace("p.m." , "PM").Replace("." , "").ToUpper() , cultureInfo); 
2

DateTime.TryParseExact()を使用してください。 LINQPadで実行した例を次に示します。

void Main() 
{ 
    System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("es-MX" , true); 
    string date = "18/12/2012 11:09:39 p.m."; 

    DateTime dt = new DateTime(2012 , 12 , 18 , 11 , 9 , 39).AddHours(12); 

    DateTime d; 
    string[] styles = {"dd/MM/yyyy hh:mm:ss tt"}; // This doesn't have to be an array - could be string 
    DateTime.TryParseExact(date, styles, cultureInfo, System.Globalization.DateTimeStyles.None, out d); 

    d.Dump(); 
} 
+0

これも失敗しました。ポストしたコードと変わりません。d = {1/1/0001 12:00:00 AM} - tryparseが失敗していると思います... – BillyDvd

+0

@BillyDvd LINQPadで実行され、正しく実行されました。それをやってみてください。 –

0

parseの2番目のパラメータとしてcultureInfo変数を使用してみてください。これにより、フォーマットプロバイダとしてカルチャが使用されます。

DateTime d = DateTime.Parse(item, cultureInfo); 
+0

偉大な心は同じように考える! –

+0

@Nicholas - 残念ながら、私は提出する前に元の質問の下でコメントを拡大しませんでした。トニーホプキンソンは私たちの前にそれを掲示しました。 – Dave

+0

これを追加すると例外が発生します。文字列が有効なDateTimeとして認識されませんでした。インデックス20から始まる不明な単語があります。 – BillyDvd

0

問題は、Parse()の呼び出しで使用するカルチャを指定していないことです。

CultureInfo mexico = CultureInfo.GetCultureInfo("es-MX"); 
Thread.CurrentThread.CurrentCulture = mexico; 

DateTime instance = DateTime.Parse(text , CultureInfo.GetCultureInfo("es-MX")) ; 

あなたの他の代替は、現在のスレッドの文化を変更することです:

DateTime d= DateTime.Parse(item); 

あなたが必要とする魔法の呪文のようなものがある:あなたの呼び出しは、現在のスレッドのCurrentCultureプロパティを使用していますDateTime.Parse()に電話する前に。現在のカルチャーを変更しても、どのように表示されるかは変わらないことに注意してください:それはスレッドのCurrentUICultureプロパティの責任です。

+0

まだ例外が生成されます。 文字列が有効なDateTimeとして認識されませんでした。インデックス20から始まる不明な単語があります。 – BillyDvd

+0

@BillyDvd、実際の文字が失敗した文字列に含まれているかどうかを確認しましたか?あなたのサンプル文字列のオフセット+20は 'p.m.'の小文字の 'p'です。私はあなたがどこかに悪いデータを持っていることを喜んで受けています。文字列に複数のスペースが埋め込まれていますか?'DateTimeStyles'の指定をサポートする' Parse() 'オーバーロードのどれかを使って、空白の処理を緩和したいかもしれません。 –

関連する問題