73

次の形式の文字列があり、次のよう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";
     }
}
4

4 に答える 4

136

DateTime.ParseExact次の方法を使用してください。

string date = "20121004";

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

これには、日付をハイフンで再フォーマットする前に検証するという利点もあります。ParseExact日付が有効な範囲内にない場合、または形式が一致しない場合、キャッチできる例外をスローします。

于 2012-06-15T15:42:15.760 に答える
6

エラーが発生します:

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

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

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

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

このエラーは発生しません。DateTime変数を生成したらyyyy-dd-mm、ToString()メソッドを使用してフォーマットで表示するだけです。

public string ToString(
    string format,
    IFormatProvider provider
)

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

これは基本的に他のすべての人と同じ情報を繰り返すことを知っていますが、彼にも提供します彼が使用する必要のある2つの方法が実際に何をするかを理解する能力。

于 2012-06-15T15:51:32.197 に答える
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;
}
于 2012-06-15T15:39:36.750 に答える
2

少し醜いですが、これはどうですか?

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

有効な日付を表す文字列を使用していると想定でき、他の日付のようなロジックを実行する必要がない場合は、DateTimeそもそもなぜaに移動するのでしょうか。

于 2012-06-15T15:40:38.917 に答える