Функция для преобразования строки (yyyyMMddhhmm) в DateTime в C # - PullRequest
3 голосов
/ 13 февраля 2012

В моей базе данных у меня есть поле даты типа varchar , где дата хранится в следующем формате ггггMMddhhmm , без пробелов и других символов, разделяющих их.

Теперь мне нужно сравнить эту дату с C # DateTime , поэтому мне нужно преобразовать строку в DateTime .Наиболее логичный способ, который я могу придумать, - это извлечь из переменной date подстроку, связанную с годом, месяцем и днем, и создать новый DateTime объект:

var year = Convert.ToInt32(date.Substring(0, 4));

var month = Convert.ToInt32(date.Substring(4, 2));

var day = Convert.ToInt32(date.Substring(6, 2));

DateTime dateToCompare = new DateTime(year, month, day);

Есть ли какой-либо доступный метод C #, который позволяет мне выполнять это преобразование без написания всего этого кода?

Ответы [ 4 ]

10 голосов
/ 13 февраля 2012

Абсолютно - используйте DateTime.ParseExact:

DateTime parsed = DateTime.ParseExact(text, "yyyyMMddHHmm",
                                      CultureInfo.InvariantCulture);

Обратите внимание на HH для 24-часового режима вместо hh для 12-часового формата.

В качестве альтернативы вы можете использовать DateTime.TryParseExact, который возвращает значение true / false, чтобы указать, был ли разбор успешным.Если вы полностью ожидаете, что все данные будут действительными, и в противном случае целесообразно выдать исключение, тогда DateTime.ParseExact подойдет.

В качестве совершенно другой альтернативы вы можете использовать NodaВремя :

// Do this once...
var pattern = LocalDateTimePattern.CreateWithInvariantInfo("yyyyMMddHHmm");

// Do this repeatedly...
var parseResult = pattern.Parse(text);
if (parseResult.Success)
{
    LocalDateTime value = parseResult.Value;
    // Use the value...
}
else
{
    // Error... 
}

Или для поведения "просто выбросить исключение", просто используйте parseResult.Value безоговорочно.

РЕДАКТИРОВАТЬ: В стороне, есть ли причина почему вы храните даты в столбце varchar?Можете ли вы вместо этого исправить свою схему?

4 голосов
/ 13 февраля 2012

Вы можете использовать DateTime.ParseExact метод.

2 голосов
/ 13 февраля 2012

попробуйте это:

string dateString;
string format;
DateTime result;
CultureInfo provider = CultureInfo.InvariantCulture;

dateString = "201202130955";
format = "yyyyMMddhhmm"

result = DateTime.ParseExact(dateString, format, provider);
2 голосов
/ 13 февраля 2012

Согласно тому, что я нашел на форумах, должно работать следующее (я сам не проверял ...)

string dateString = "20060425185231";

DateTime myDate;

myDate = DateTime.ParseExact(dateString,"yyyyMMddHHmmss", new DateTimeFormatInfo());

MessageBox.Show(myDate.ToString());

источник: http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/c337c192-8047-4edf-83e2-c3511591c42f/

...