Подтвердить что ты не робот

Преобразовать 20121004 (yyyyMMdd) в допустимое время?

У меня есть строка в следующем формате 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";
     }
}
4b9b3361

Ответ 1

Просто используйте метод DateTime.ParseExact:

string date = "20121004";

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

Это также дает преимущество проверки даты, прежде чем переформатировать ее с помощью дефиса. ParseExact выдает исключение, которое вы можете поймать, если дата не находится в допустимом диапазоне или формат не соответствует.

Ответ 2

Я получаю сообщение об ошибке:

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

Я знаю, что это в основном повторяет ту же информацию, что и все остальные, но также дает ему возможность понять, какие именно методы, которые ему нужно использовать, на самом деле.

Ответ 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;
}

Ответ 4

Это немного уродливо, но как насчет этого?

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

Если вы можете предположить, что вы входите со строкой, представляющей действительную дату, и вам не нужно делать какую-либо другую логику даты, то зачем вам сначала обращаться к DateTime?

Ответ 5

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