Преобразовать 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";
}
}
Ответы
Ответ 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,"-");