2009-08-25 24 views
3

DateTime.ParseExactを使用してDateTimeの文字列を解析するのに問題があります。DateTime文字列を解析する

DateTime result; 
    CultureInfo provider = CultureInfo.InvariantCulture; 

    // Parse date-only value with invariant culture. 
    //format = "mm/dd/yyyy"; 
format = "d"; 
    try 
    { 

     result = DateTime.ParseExact(data+" 12:00:00 AM", format, provider); 
    } 

dataは、「5/20/2009」という形式の日付がロードされた文字列変数です。私はちょうどそれがうまくいくかどうかを見るために偽の時間をタックしてみました。それは(タックがあってもなくても)でした。私も "g"形式指定子を使ってみましたが、うまくいきませんでした。私はいつも有効なDateTime文字列ではないという例外を受け取ります。それが働く唯一の日付は "12/20/2009"のようなものです( "MM"の部分に2桁が表示されます)

私はこのルーチンを1桁の月で使用することはできません! MSDNのMSDNの例は

6/15/2009 1:45:30 PM -> 6/15/2009 (en-US)

です。これは動作しません。私は間違っていることを理解していないだけです。私はまた、 "mm/dd/yyyy"や "MM/dd/yyyy"のような独自のフォーマット指定子を試しましたが、無駄です。

答えて

6

あなたはEN-US形式でのDateTimeを解析する場合は、EN-USの文化を指定する必要があります。

DateTime.ParseExact("6/15/2009", "d", CultureInfo.GetCultureInfo("en-US")); 
+0

なぜ私はその文化を指定する必要がありますか?また、それはParseExactではありません。日付文字列がどのような形式から来ているのか正確に知っていますが、なぜ形式文字列を使用できないのでしょうか?これを使用して、そこにはいけないものを持ち込むことができます(日付フィールドの時刻を指定するのはいいえです) – Earlz

+0

私の例をParseExactに変更しました。カルチャーを指定する必要があります。なぜなら、カルチャー固有の方法で(つまり、en-US形式で)入力内容を解析したいと言うからです。 – dtb

+0

さて、私は不変量が米国を意味すると思った。..ありがとう! – Earlz

4

私はあなたが使用したいと思う:のみ

format = "M/dd/yyyy"; 

お知らせ1 M.

確認と詳細については、this article on MSDNを参照してください。

+0

いいえ、それは間違っています。それは "11/15/2009"が "1/15/2009"に変わるようになります – Earlz

+2

実際に試しましたか?私の持っているので、うまくいくようです(2009/11/15は1/15/2009にはなりません)。 1 'M'は、単純に1桁の月の前にゼロを追加しないことを示します(ToString( "0")をIntegerで呼び出すと、パディングゼロのない数値が返されます)。 –

+0

Danの権利。あなたが余分なMなしで11→1を変換すると思うなら、フォーマット文字列が何を意味するのか理解していません。 – davewasthere

1

ParseExactは、本培養のためだけのプレースホルダですフォーマット文字列で使用されるときに、正確なロングフォーマット指定子(例:MM/DD/YYYY)だけではなく、「D」

+0

これはまだ例外を与えます。私が "0"をつけて "06/20/2009"のようなものを作るなら、それはすべて正しいものを解析するでしょうが、その月は1になるので、 "1/20/2009"になります。センス。 – Earlz

0

文字「/」を使用する必要があります特定の日付分離文字。リテラルにするには '\'でエスケープする必要があります。

私が正しくあなたの問題を理解している場合、あなたとあなたのテキストを解析することができる場合があります

DateTime.ParseExact(data, "MM\/dd\/yyyy", CultureInfo.InvariantProvider);