2012-06-15 11 views
17

私は次の形式yyyyMMddの文字列を持っていると私はそれがこのように見えるように取得しようとしています:私はしようとすると20121004(yyyyMMdd)を有効な日付時刻に変換しますか?

yyyy-MM-dd

string date = "20121004"; 

Convert.ToDateTime(date).ToString("yyyy-MM-dd"); 

私はエラーを取得する:

FormatException: String was not recognized as a valid DateTime.

問題:

private string GetValidDate(string date,string format) 
{ 
    DateTime result; 
    if(DateTime.TryParseExact(date, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out result)) 
    { 
     return date; 
    } 
    else if(DateTime.TryParseExact(date, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out result)) 
    { 
     return DateTime.ParseExact(date, "yyyyMMdd", 
       CultureInfo.InvariantCulture).ToString("yyyy-MM-dd"); 
    } 
    else 
    { 
     return "Invalid Date Format"; 
    } 
} 
+1

ソース文字列にyyyyMMdd形式が保証されていますか?もしそうなら、文字列メソッドを使ってハイフンを追加するだけではどうですか? – jglouie

+0

私はそれについて考えました。そのための最良の方法は何ですか? – Xaisoft

+0

以下に文字列ベースの回答があります。それは非常に妥当であるようです – jglouie

答えて

28

だけDateTime.ParseExactメソッドを使用します。

string date = "20121004"; 

string result = DateTime.ParseExact(date, "yyyyMMdd", 
       CultureInfo.InvariantCulture).ToString("yyyy-MM-dd"); 

これをまた、ハイフンでそれを再フォーマットする前に、日付を検証する利点を提供します。 ParseExactは、日付が有効な範囲にないか、フォーマットが一致しない場合に捕捉できる例外をスローします。

+0

+1 DateTime.ParseExactは、カスタム形式を処理する正しい方法です。 –

+0

日付が常に有効であることがわかっていれば必要ですか?ちょっと興味があるんだけど。 – Xaisoft

+1

日付を扱うとき、私は個人的には、それをさらに処理する前に検証することが常に不可欠であると思います。 –

3

私が使用している拡張方法は次のとおりです。

/// <summary> 
/// Converts a string to a dateTime with the given format and kind. 
/// </summary> 
/// <param name="dateTimeString">The date time string.</param> 
/// <param name="dateTimeFormat">The date time format.</param> 
/// <param name="dateTimeKind">Kind of the date time.</param> 
/// <returns></returns> 
public static DateTime ToDateTime(this string dateTimeString, string dateTimeFormat, DateTimeKind dateTimeKind) 
{ 
    if (string.IsNullOrEmpty(dateTimeString)) 
    { 
     return DateTime.MinValue; 
    } 

    DateTime dateTime; 
    try 
    { 
     dateTime = DateTime.SpecifyKind(DateTime.ParseExact(dateTimeString, dateTimeFormat, CultureInfo.InvariantCulture), dateTimeKind); 
    } 
    catch (FormatException) 
    { 
     dateTime = DateTime.MinValue; 
    } 

    return dateTime; 
} 
+0

これを呼び出す例を示すことができますか、どのような種類のDateTimeKindを使用できるか説明できますか? –

0

これはちょっと醜いですが、これはどうですか?

date.Insert(6, "-").Insert(4, "-"); 

あなたが有効な日付を表す文字列で来ていると仮定することができますし、他の日付っぽいロジックを実行する必要がない場合は、なぜ最初の場所でDateTimeに行きますか?

+0

おそらく、彼は日付が有効であることを最初に確認する必要があります。 '' DateTime.ParseExact''はこれを実行します。 –

+2

実際の問題は、彼のコードがうまくいかない理由です。このコードは基本的に彼が望むものを与えるが、醜いコードを提供することは愚かなようだ。 –

+0

+1、彼はハイプテンを追加しようとしているだけです。そして、それは有効なdatetime、別名正しい形式として表示されます。彼は日付のチェックが有効であることを指定していないので、彼の日付がすでに有効であると見なすことができます。 – Doomsknight

-1
string date = "20121004"; 
date = date.Insert(6,"-"); 
date = date.Insert(4,"-"); 
+0

ユーザがこのコードを使用した場合、 'date'は' 10-04'と等しくなります。これは明らかに彼が望むものではありません。さらに、それは明らかに有効な日付ではない文字列 "20129999"を許可します。 –

+0

@Ramhound:コードは 'date'を' '' '2012-10-04" 'に設定します。なぜそれが「10-04」と思われるのですか? – comecme

5

I get the error:

FormatException: String was not recognized as a valid DateTime.

ToDateTime()メソッドに文字列の解析方法を教えていないため、このエラーが発生しています。

次の方法を使用する場合:

public static DateTime ParseExact(
    string s, 
    string format, 
    IFormatProvider provider, 
    DateTimeStyles style 
) 

あなたはこのエラーを取得することはありません。 DateTime変数を生成した後は、ToString()メソッドを使用してyyyy-dd-mmの形式で表示するだけです。 http://msdn.microsoft.com/en-us/library/9h21f14e

http://msdn.microsoft.com/en-us/library/8tfzyc64

public string ToString(
    string format, 
    IFormatProvider provider 
) 
私は、これは基本的に他の皆と同じ情報を繰り返し知っているが、それはまた、彼に彼が必要2つの方法がありません、実際に使用するかを理解する能力を提供します。

+0

詳細な説明に感謝します。 – Xaisoft

関連する問題