4

ユーザー入力を解析して検証するコードがあります。

DateTime myDateTime = DateTime.Parse(userInput,currentCulture);

現在のカルチャは(en-caまたはfr-caに)設定されており、ユーザー入力は常にISO8601形式「yyyy-MM-dd」です。

ユーザーが1900-01-01と入力すると、日付は期待どおりに作成されます。 入力が「1900-01+01」の場合、作成された日時は1899-12-31 6:00:00 PM 例外はスローされませんが、DateTime.Parseはこれを間違った日付に変換します。

この作品を作るために私は使ってDateTime.ParseExact(userInput,"yyyy-MM-dd",currentCulture)います。

だから私の質問はこれをどのように機能させるかではなく(私はそれを持っています)、+ 01または任意の+値はどうですか?ISO規格に何か欠けていますか?

4

1 に答える 1

4

ISO8601の唯一+の部分は時間オフセット部分であり、この場合はこのように解析されているように見えます。しかし、私が知る限り、時間オフセットが許可される前に、日付の3つの部分すべてが有効な値を持つ必要があります。

使用することをお勧めしますDateTime.ParseExact(userInput,"yyyy-MM-dd",...(多分InvariantCulture)を使用することもできます。

DateTime.Parse多種多様な入力を受け入れ、ユーザーの意図を最もよく推測しようとします。これは、単純に紛らわしい方法で推測する場合のように感じます。

サンプル値(最初のローカルPDT、明示的な時間オフセットを持つ他の2つ):

DateTime.Parse("1900-02"   ).ToUniversalTime()    //  2/ 1/1900  8:00:00 AM 
DateTime.Parse("1900-02+00").ToUniversalTime()    //  2/ 1/1900 12:00:00 AM
DateTime.Parse("1900-02+03").ToUniversalTime()    //  1/31/1900  9:00:00 PM

これはParse本質的にとして扱わ"YYYY-MM+0x"れるようです"YYYY-MM-01T00:00+0x"

于 2012-11-14T16:59:30.513 に答える