import pathlib current_dir = pathlib.Path(__file__).parent current_file = pathlib.Path(__file__)
Doc ref: ссылка
DateTime.Parse()
попытается определить формат данной даты, и обычно это хорошо работает. Если вы можете гарантировать, что даты всегда будут в определенном формате, вы можете использовать ParseExact()
:
string s = "2011-03-21 13:26";
DateTime dt =
DateTime.ParseExact(s, "yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture);
(Но обратите внимание, что обычно безопаснее использовать один из методов TryParse в случае, если дата не в ожидаемом формате)
При построении строки формата убедитесь, что Пользовательские строки даты и времени , особенно обратите внимание на количество букв и регистра (т. е. «ММ» и [mm] - это разные вещи.
Другим полезным ресурсом для строк формата C # является Форматирование строк в C #
Вы также можете использовать XmlConvert.ToDateString
var dateStr = "2011-03-21 13:26";
var parsedDate = XmlConvert.ToDateTime(dateStr, "yyyy-MM-dd hh:mm");
Хорошо указать тип даты, код:
var anotherParsedDate = DateTime.ParseExact(dateStr, "yyyy-MM-dd hh:mm", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
Подробнее о различных параметрах разбора http://amir-shenodua.blogspot.ie/2017/06/datetime-parsing-in-net.html
DateTime.Parse () должен отлично работать для этого формата строки. Ссылка:
http://msdn.microsoft.com/en-us/library/1k1skd40.aspx#Y1240
Выбрасывает исключение FormatException для вы?
var dateStr = @"2011-03-21 13:26";
var dateTime = DateTime.ParseExact(dateStr, "yyyy-MM-dd HH:mm", CultureInfo.CurrentCulture);
Как я объясняю позже, я всегда предпочитаю методы TryParse
и TryParseExact
. Поскольку они немного громоздки для использования, я написал метод расширения, который упрощает разбор:
var dtStr = "2011-03-21 13:26";
DateTime? dt = dtStr.toDate("yyyy-MM-dd HH:mm");
В отличие от Parse
, ParseExact
и т. Д. Он не генерирует исключение и позволяет вы проверите через
if (dt.HasValue) { // continue processing } else { // do error handling }
, было ли преобразование успешным (в этом случае dt
имеет значение, к которому вы можете получить доступ через dt.Value
) или нет (в этом случае , null
).
Это даже позволяет использовать элегантные ярлыки, такие как «Elvis» -оператор ?.
, например:
int? year = dtStr?.toDate("yyyy-MM-dd HH:mm")?.Year;
Здесь вы также можете используйте year.HasValue
, чтобы проверить, удалось ли преобразование, и если это не удалось, тогда year
будет содержать null
, в противном случае - годовую часть даты. Если преобразование не сработало, нет никакого исключения.
public static class Extensions
{
public static DateTime? toDate(this string dateTimeStr, string[] dateFmt)
{
// example: var dt = "2011-03-21 13:26".toDate(new string[]{"yyyy-MM-dd HH:mm",
// "M/d/yyyy h:mm:ss tt"});
const DateTimeStyles style = DateTimeStyles.AllowWhiteSpaces;
if (dateFmt == null)
{
var dateInfo = System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat;
dateFmt=dateInfo.GetAllDateTimePatterns();
}
DateTime? result = null;
DateTime dt;
if (DateTime.TryParseExact(dateTimeStr, dateFmt,
CultureInfo.InvariantCulture, style, out dt)) result = dt;
return result;
}
public static DateTime? toDate(this string dateTimeStr, string dateFmt=null)
{
// example: var dt="2011-03-21 13:26".toDate("yyyy-MM-dd HH:mm");
// or simply var dt="2011-03-21 13:26".toDate();
// call overloaded function with string array param
string[] dateFmtArr = dateFmt == null ? null : new string[] { dateFmt };
return toDate(dateTimeStr, dateFmtArr);
}
}
Обновление: .toDate()
(без параметров) теперь по умолчанию ко всем общим шаблонам даты / времени текущей культуры потока. Заметим, что нам нужны result
и dt
вместе, потому что TryParseExact
не позволяет использовать DateTime?
, который мы намерены вернуть. В C # Version 7 вы можете немного упростить функцию toDate
следующим образом:
// in C#7 only: "DateTime dt;" - no longer required, declare implicitly
if (DateTime.TryParseExact(dateTimeStr, dateFmt,
CultureInfo.InvariantCulture, style, out var dt)) result = dt;
(Также будет разрешено писать out DateTime dt
вместо out var dt
.)
Пример:
var dtStr="2011-03-21 13:26";
var dt=dtStr.toDate("yyyy-MM-dd HH:mm");
if (dt.HasValue)
{
Console.WriteLine("Successful!");
// ... dt.Value now contains the converted DateTime ...
}
else
{
Console.WriteLine("Invalid date format!");
}
Как вы можете видеть, этот пример просто запрашивает dt.HasValue
, чтобы узнать, было ли преобразование успешным или нет. В качестве дополнительного бонуса TryParseExact позволяет указать строгую DateTimeStyles
, чтобы вы точно знали, была ли передана правильная дата / время.
N.B. Перегруженная функция позволяет вам передать массив допустимых форматов, используемых для парсинга / преобразования дат, как показано здесь здесь (TryParseExact
прямо поддерживает это), например
string[] dateFmt = {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt",
"MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss",
"M/d/yyyy hh:mm tt", "M/d/yyyy hh tt",
"M/d/yyyy h:mm", "M/d/yyyy h:mm",
"MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm"};
var dtStr="5/1/2009 6:32 PM";
var dt=dtStr.toDate(dateFmt);
Однако, чтобы сохранить код коротким, я использую только перегрузку строкового массива TryParseExact, потому что он не работает с параметром Generic.
Расширенный пример: вы можете использовать оператор ??
по умолчанию к отказоустойчивому формату, например
var dtStr = "2017-12-30 11:37:00";
var dt = (dtStr.toDate()) ?? dtStr.toDate("yyyy-MM-dd HH:mm:ss");
. В этом случае .toDate()
будет использовать общие форматы даты локальной культуры, и если все это не удастся, он попытается использовать ISO стандартный формат "yyyy-MM-dd HH:mm:ss"
в качестве резервной копии. Таким образом, функция расширения позволяет легко «сгруппировать» различные резервные форматы.
Наконец, вот некоторые комментарии к фону (то есть причина, по которой я написал это так):
Я предпочитаю TryParseExact в этом методе расширения, потому что вы избегаете обработки исключений - вы можете прочитать статью Эрика Липперта об исключениях , почему вы должны использовать TryParse, а не Parse, я цитирую его об этом тема: 2)
Это неудачное дизайнерское решение1) [аннотация: чтобы метод Parse выкинул исключение] был настолько досадным, что, конечно, команда фреймворков внедрила TryParse вскоре после этого, что делает правильные вещи.
blockquote>Это так, но
TryParse
иTryParseExact
все еще намного меньше, чем удобно использовать: они заставляют вас использовать неинициализированную переменную в качестве параметраout
, который не должен быть нулевым, и при преобразовании вам нужно оценить возвращаемое значение boolean - либо вы должны использоватьif
sta немедленно, или вам нужно сохранить возвращаемое значение в дополнительной логической переменной, чтобы вы могли выполнить проверку позже. И вы не можете просто использовать целевую переменную, не зная, было ли преобразование успешным или нет.В большинстве случаев вам просто нужно знать , было ли преобразование успешным или нет (и, конечно, значение, если оно было успешным) , поэтому переменная с нулевым значением, которая сохраняет все информация была бы желательной и намного более изящной, поскольку вся информация просто хранится в одном месте: это непротиворечиво и простота в использовании и гораздо меньше подвержена ошибкам.
Метод расширения, который я написал, что (он также показывает вам, какой код вам придется писать каждый раз, если вы не собираетесь его использовать).
Я считаю, что преимущество
.toDate(strDateFormat)
в том, что он выглядит простым и чистым - так же просто, как предполагалось, оригиналDateTime.Parse
, но с возможностью проверить, было ли преобразование успешным, и без исключений.
1) Что здесь имеется в виду это обработка исключений (т. е. блок
try { ... } catch(Exception ex) { ...}
), что необходимо, когда вы используете Parse, потому что он будет генерировать исключение, если синтаксический анализ недействительной строки - не только лишний y в этом случае, но также раздражает и усложняет ваш код. TryParse избегает всего этого, как показывает образец кода, который я предоставил.
2) Эрик Липперт - известный сотрудник StackOverflow и работает в Microsoft как основной разработчик в команде компилятора C # в течение нескольких лет.
Простой и понятный ответ ->
using System;
namespace DemoApp.App
{
public class TestClassDate
{
public static DateTime GetDate(string string_date)
{
DateTime dateValue;
if (DateTime.TryParse(string_date, out dateValue))
Console.WriteLine("Converted '{0}' to {1}.", string_date, dateValue);
else
Console.WriteLine("Unable to convert '{0}' to a date.", string_date);
return dateValue;
}
public static void Main()
{
string inString = "05/01/2009 06:32:00";
GetDate(inString);
}
}
}
/**
* Output:
* Converted '05/01/2009 06:32:00' to 5/1/2009 6:32:00 AM.
* */
Поместите значение удобочитаемой строки в .NET DateTime с таким кодом:
DateTime.ParseExact("April 16, 2011 4:27 pm", "MMMM d, yyyy h:mm tt", null);
s
есть синтаксическая ошибка. Следовательно, лучше использовать TryParseExcact. Я указал, почему в моем ответе ниже. – Matt 4 September 2015 в 13:11