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

我知道这基本上重复了与其他人相同的信息,但它也为他提供了能够理解他需要使用的两种方法实际上是做什么的。

于 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 回答