2016-07-19 10 views
1

言語:私たちが使用している私たちのプロジェクトの一つでそう DateTime.ParseExact文字列は1台のPC上で有効な日時として認識されませんでした

:のC#、.NETフレームワーク: 4.5、使用方法DateTimeに文字列を解析するには、次の機能:

private DateTime FormatDate(string date, string format) 
{ 
    try 
    { 
     IFormatProvider culture = new CultureInfo("en-US", true); 
     DateTime dt = DateTime.ParseExact(date, format, culture); 
     return dt; 
    } 
    catch (Exception ex) 
    { 
     throw new Exception(ex.Message); 
    } 
} 

とこのようにそれを呼び出す:

DateTime startDate = FormatDate("01/17/2016", "M/d/yyyy"); 

3台のPCでは、各PCの日付形式がdd/MM/yyyyで、2台のPCで日付形式がdd-MMM-yyの場合、ParseExactを実行しようとするとバグが発生します:

文字列が有効なDateTimeとして認識されませんでした。

dd-MMM-yy形式を使用しても、3台目のPCで動作し続けますが、

: 私はすべての3のPC上の日付と時刻の設定を比較して、設定がすべて等しく、違いが1つ2のPC上で、私たちは、Visual Studioを使用することを2013年第三のVisual Studioの中、2015年

例外の詳細です

メッセージ:文字列が有効なDateTimeとして認識されませんでした。

のInnerException:いいえ内部例外

スタック:System.DateTime.ParseExact(Stringを、文字列の形式、するIFormatProviderプロバイダー)AssetTracking.PopUpWindows.AddItem_Warranty.MakeReminderで で(TrackersDataContext ATDC、アイテムNI、文字列のitemId) d:¥Solutions¥Trackers¥Trackers¥PopUpWindows¥AddItem_Warranty.xaml.cs:Line 807 at Trackers.PopUpWindows.AddItem_Warranty。 <> c__DisplayClass8.b__3()dは:\ソリューション\タッカー\トラッカー\ PopUpWindows \のAddItem_Warranty.xaml.cs:ライン685

質問: 私はわからないが、別のIDEの一部であり、問題?または、他に何人かのPCでこのバグを作り出すことができますが、まったく同じ日付と時刻の設定を持つ他の人にはできません。

+0

使用しているIDEは、コードのコンパイルにも影響しません。私はそれが文化の設定のような何かになると思うだろうhttp://stackoverflow.com/questions/27230972/datetime-parse-works-on-one-machine-but-not-the-other – Kritner

+2

あなたは ' DateTimeFormatInfo.GetInstance(新しいCultureInfo( "en-US"、true))。各マシンでGetAllDateTimePatterns()?これらのパターンは 'DateTime.ParseX()'メソッドで試されます –

+0

あなたのフォーマットに一致する区切り文字で日付文字列が常に渡されることを確かめますか? – Steve

答えて

0

最初のものは、あなたの例外処理が壊れている、次のとおりです。

private DateTime FormatDate(string date, string format) 
{ 
    try 
    { 
     IFormatProvider culture = new CultureInfo("en-US", true); 
     return DateTime.ParseExact(date, format, culture); 
    } 
    catch (Exception ex) 
    { 
     throw new Exception(ex.Message); 
    } 
} 

ありcatchブロックで行われるものではないので、それだけでスタックトレースを壊します。それをすべて削除します。

private DateTime FormatDate(string date, string format) 
{ 
    IFormatProvider culture = new CultureInfo("en-US", true); 
    return DateTime.ParseExact(date, format, culture); 
} 

第二のポイントは、あなたがを提供された値を、実際にあなたが指定されたパターンdd-MMM-yyと一致していません。したがって、明らかにDateTime.ParseExact関数が適切な例外をスローします。ここでは、有効な入力値の例です:

var startDate = FormatDate("11-Mar-16", "dd-MMM-yy"); 

あなたは数として月を意味している場合、余分なMを削除します。

+0

を参照してくださいParseExact should'nt適切な日付の文字列を取ることができますし、2番目のパラメータで渡された任意の日付形式にフォーマット?それが実行されているマシンのフォーマットには影響されませんか? – Saleem

+0

もしそうなら、3日目と同じ日付と時刻のフォーマットを持つ他の2台のPCに例外がスローされないのはなぜですか? – Saleem

+2

@Saleem 'ParseExact'は、特定の特定の入力値と指定した非常に特定のformat_に対して有効な' DateTime'を返そうとします。両方が一致しない場合、失敗します。指定されたパターンに入力値が正確に一致すると期待しない場合は、 'Parse'を使用してください。 – ken2k

関連する問題