У меня есть дата и время в строке, отформатированной так:
"2011-03-21 13:26" //year-month-day hour:minute
Как я могу разобрать это System.DateTime
?
Я хочу использовать такие функции, как DateTime.Parse()
или, DateTime.ParseExact()
если возможно, чтобы иметь возможность указать формат даты вручную.
Ответы:
DateTime.Parse()
постараюсь выяснить формат заданной даты, и это обычно делает хорошую работу. Если вы можете гарантировать, что даты всегда будут в заданном формате, вы можете использоватьParseExact()
:(Но обратите внимание, что обычно безопаснее использовать один из методов TryParse, если дата не в ожидаемом формате)
Обязательно проверяйте пользовательские строки формата даты и времени при построении строки формата, особенно обратите внимание на количество букв и регистр (т. Е. «ММ» и «мм» означают очень разные вещи).
Другим полезным ресурсом для строк формата C # является форматирование строк в C #
источник
s
. Следовательно, лучше использовать TryParseExcact. Я указал, почему в моем ответе ниже.Как я объясняю позже, я бы всегда предпочитать
TryParse
иTryParseExact
методы. Поскольку они немного громоздки в использовании, я написал метод расширения, который значительно упрощает анализ:В отличие от
Parse
иParseExact
т. Д. Он не выдает исключение и позволяет проверять черезif (dt.HasValue) { // continue processing } else { // do error handling }
было ли преобразование успешным (в этом случае
dt
имеет значение, к которому вы можете получить доступ черезdt.Value
) или нет (в этом случае это такnull
).Это даже позволяет использовать элегантные ярлыки, такие как «Элвис» -оператор
?.
, например:Здесь вы также можете использовать,
year.HasValue
чтобы проверить, успешно ли выполнено преобразование и будет ли оно выполнено , в противном случаеyear
будетnull
указана годовая часть даты. Нет исключения, если преобразование не удалось.Решение: метод расширения .ToDate ()
Попробуйте это в .NetFiddle
Некоторая информация о коде
Вы можете спросить, почему я использовал
InvariantCulture
вызовTryParseExact
: это заставляет функцию обрабатывать шаблоны формата всегда одинаково (в противном случае, например, "." Может интерпретироваться как десятичный разделитель в английском, в то время как это разделитель группы или разделитель даты в Немецкий). Напомним, что мы уже запрашивали строки форматирования на основе культуры несколькими строками раньше, так что здесь все в порядке.Обновление:
.ToDate()
(без параметров) теперь по умолчанию используются все распространенные шаблоны даты / времени в текущей культуре потока.Обратите внимание, что нам нужно
result
иdt
вместе, потомуTryParseExact
что не позволяет использоватьDateTime?
, что мы намерены вернуть. В C # версии 7 вы моглиToDate
бы немного упростить функцию следующим образом:или, если вам нравится еще короче
в этом случае вам не нужны эти два объявления
DateTime? result = null;
иDateTime dt;
вообще - вы можете сделать это в одной строке кода. (Было бы также разрешено писатьout DateTime dt
вместо того,out var dt
если вы предпочитаете это).Я упростил код дальше, используя
params
ключевое слово: Теперь вам не нужен 2 - й перегруженного метода больше.Пример использования
Как видите, этот пример просто запрашивает,
dt.HasValue
было ли преобразование успешным или нет. В качестве дополнительного бонуса, TryParseExact позволяет указать строгий,DateTimeStyles
чтобы вы точно знали, была ли передана правильная строка даты / времени или нет.Больше примеров использования
Перегруженная функция позволяет передавать массив допустимых форматов, используемых для разбора / преобразования дат, как показано здесь (также
TryParseExact
это поддерживается напрямую), напримерЕсли у вас есть только несколько шаблонов шаблонов, вы также можете написать:
Расширенные примеры
Вы можете использовать
??
оператор по умолчанию в отказоустойчивом формате, напримерВ этом случае они
.ToDate()
будут использовать распространенные форматы дат местной культуры, а если все это не удастся, он попытается использовать стандартный формат ISO"yyyy-MM-dd HH:mm:ss"
в качестве запасного варианта. Таким образом, функция расширения позволяет легко «связывать» различные резервные форматы.Вы даже можете использовать расширение в LINQ, попробуйте это (это в .NetFiddle выше):
который преобразует даты в массиве на лету, используя шаблоны, и выводит их на консоль.
Некоторые сведения о TryParseExact
Наконец, вот несколько комментариев об истории вопроса (т.е. причина, по которой я написал это так):
Я предпочитаю TryParseExact в этом методе расширения, потому что вы избегаете обработки исключений - вы можете прочитать в статье Эрика Липперта об исключениях, почему вы должны использовать TryParse, а не Parse, я процитирую его по этой теме: 2)
Это так, но
TryParse
и то , иTryParseExact
другое по-прежнему гораздо менее удобны в использовании: они вынуждают вас использовать неинициализированную переменную в качествеout
параметра, который не должен иметь значение NULL, и во время преобразования вам необходимо оценить логическое возвращаемое значение - либо у вас есть использоватьif
оператор немедленно или вам нужно сохранить возвращаемое значение в дополнительной логической переменной, чтобы вы могли выполнить проверку позже. И вы не можете просто использовать целевую переменную, не зная, было ли преобразование успешным или нет.В большинстве случаев вы просто хотите узнать, было ли преобразование успешным или нет (и, конечно, значение, если оно было успешным) , поэтому желательной и намного более элегантной будет целевая переменная, которая хранит всю информацию, потому что вся информация просто хранится в одном месте: это согласованно и просто в использовании, и намного менее подвержено ошибкам.
Метод расширения, который я написал, делает именно это (он также показывает, какой код вам придется писать каждый раз, если вы не собираетесь его использовать).
Я считаю, что выгода в
.ToDate(strDateFormat)
том, что он выглядит простым и понятным - настолько простым, какимDateTime.Parse
должен был быть оригинал, - но с возможностью проверки успешности преобразования и без исключения.1) Под этим подразумевается, что обработка исключений (т. Е.
try { ... } catch(Exception ex) { ...}
Блока), которая необходима, когда вы используете Parse, потому что она генерирует исключение, если анализируется недопустимая строка, не только не нужна в этом случае, но и раздражает, и усложняя ваш код. TryParse избегает всего этого, как показывает пример кода, который я предоставил.2) Эрик Липперт - известный сотрудник StackOverflow, пару лет проработавший в Microsoft в качестве основного разработчика в команде компилятора C #.
источник
Проверьте эту ссылку для других строк формата!
источник
DateTime.Parse () должен нормально работать для этого формата строки. Ссылка:
http://msdn.microsoft.com/en-us/library/1k1skd40.aspx#Y1240
Это исключение FormatException для вас?
источник
Поместите значение удобочитаемой строки в .NET DateTime с кодом, подобным этому:
источник
Простой и прямой ответ ->
источник
Вы также можете использовать XmlConvert.ToDateString
Хорошо указать вид даты, код:
Подробнее о различных параметрах синтаксического анализа http://amir-shenodua.blogspot.ie/2017/06/datetime-parsing-in-net.html.
источник
Попробуйте следующий код
источник