3.5 では奇妙な DateTime.Parse 例外が発生しますか?
-
27-09-2019 - |
質問
このコード行は私のコンピュータ (64 ビット Win7) で動作します。VM 内の XP 32 ビットでテストしました。うまくいきます。
static bool HasExpire { get { return DateTime.Now >= DateTime.Parse("10/20/2010"); } }
ただし、クライアント マシンでは次の例外がスローされます。
現在のWeb要求の実行中に、未解決の例外が生成されました。例外の原点と位置に関する情報は、以下の例外スタックトレースを使用して識別できます。
[FormatException: String was not recognized as a valid DateTime.] System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles) +2838082
私の VM では日付が解析できるのに、クライアント マシンでは日付が解析できないのはなぜですか?日付はハードコードされています。どうしてこんなことが起こるのか理解できません。クライアントが 3.5 であることを確認しました。常に false を返すようにその行を変更すると、試用期間の期限がいつ切れたかが分からないことを除けば、アプリは完全に正常に動作します。
解決
DateTime.Parse
ロケールに依存するため、予期せず FormatException がスローされる場合があります。MSDN ページから:
書式設定は、現在の DateTimeFormatInfo オブジェクトのプロパティの影響を受けます。これらのプロパティは、既定では、コントロール パネルの [地域と言語のオプション] 項目から派生します。
むしろ使いたいかもしれません DateTime.ParseExact
.
他のヒント
他のコンピューターは、リージョンが異なるため、おそらく日付をdd / MM / yyyyとして解析しようとしています。日付を「2010-10-20」と入力すると、解析できるはずです
AntiDogsは、問題の正確な原因を示します。ただし、ParseExactを使用すると、正確な形式がわかり、クライアントコードがこの形式に準拠していることが保証されます。
私たちのシステムでは、バグ要件のために異なるクライアントが、2つの異なるカルチャのDateTime値をサーバーコンポーネントに送信します。次のコードを使用して処理します: ジェネラコディセタグプレ
ここでは、最初に現在のカルチャ情報を使用して解析を試み、次に不変のカルチャ情報を使用して解析を試みます。もちろん、それは理想的ではありませんが、私たちのニーズに完全に適合しています。