Нужно разбирать dd.MM.yyyy в DateTime, используя TryParse
Мне нужно проанализировать строку DateTime. Строка всегда находится в следующем формате
"10.10.2010" Это означает dd.MM.yyyy, разделенный точками.
Я хочу использовать DateTime.TryParse или любой другой метод. Пожалуйста, предложите.
ОБНОВЛЕНИЕ
Обновлен вопрос. Я просто ищу правильный метод для достижения цели.
Не ручной синтаксический анализ
Ответы
Ответ 1
TryParse
не позволяет указать формат, но вы можете использовать TryParseExact
:
DateTime date;
if (DateTime.TryParseExact(text, "dd'.'MM'.'yyyy",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out date))
{
// Success
}
else
{
// Parse failed
}
Обратите внимание, что точка не обязательно должна быть экранирована кавычками, но лично мне нравится помещать любой литеральный текст в кавычки, чтобы убедиться, что он не будет изменен. Это личное предпочтение, хотя вы могли бы просто использовать "dd.MM.yyyy", если хотите.
Аналогично, я указал инвариантную культуру, которую я обычно делаю для фиксированного пользовательского стиля, но вы могли бы использовать ее в текущей культуре или определенной другой культуре, если хотите. При использовании пользовательского стиля (а не стандартного стиля, такого как "длинная дата" ), он, по общему признанию, имеет какое-то значение.
Ответ 2
Используйте метод TryParseExact
:
DateTime parsed;
if (DateTime.TryParseExact(yourString, "dd'.'MM'.'yyyy",
CultureInfo.CurrentCulture, DateTimeStyles.None, out parsed))
{
// success
}
Ответ 3
Почему бы не использовать ParseExact
вместо этого?
var theDate = DateTime.ParseExact("dd.MM.yyyy", yourDateString, CultureInfo.InvariantCulture);
Ответ 4
Бразильский кодек
public static bool IsDateTime(string txtDate)
{
DateTime tempDate;
return DateTime.TryParseExact(txtDate,"dd/MM/yyyy",
new CultureInfo("pt-BR"),
DateTimeStyles.None, out tempDate);
}
Ответ 5
использовать DateTime.TryParseExact(...)
Ответ 6
Вы можете использовать DateTime.TryParseExact
Ответ 7
попробуйте "ddMMyyy", без "-/."
Ответ 8
Я обнаружил, что jquery datepicker добавит в строку непечатаемые символы. Поэтому, когда вы пытаетесь преобразовать в другой формат, каждый раз он будет выдавать неверную ошибку даты. В моем случае я просто пытался перевести его обратно на отметку времени из любой культуры, в которой находился пользователь в то время. Это несколько хакерский подход, но это сработало для меня.
static public string ToDigitsOnly(string input)
{
Regex digitsOnly = new Regex(@"[^\d]");
return digitsOnly.Replace(input, "");
}
static private DateTime ConvertDateTimeToDate(string dateTimeString, String langCulture)
{
System.DateTime result;
string[] dateString = dateTimeString.Split('/');
try
{
if (langCulture != "en")
{
int Year = Convert.ToInt32(ToDigitsOnly(dateString[2]));
int Month = Convert.ToInt32(ToDigitsOnly(dateString[1]));
int Day = Convert.ToInt32(ToDigitsOnly(dateString[0]));
result = new DateTime(Year, Month, Day, 00, 00, 00);
}
else
{
int Year = Convert.ToInt32(dateString[2]);
int Month = Convert.ToInt32(dateString[0]);
int Day = Convert.ToInt32(dateString[1]);
result = new DateTime(Year, Month, Day, 00, 00, 00);
}
}
catch
{
// last attempt
result = Convert.ToDateTime(dateTimeString, CultureInfo.GetCultureInfo("en-US"));
}
return result;
}