using System.Globalization;
public static void Main()
var dtStr = "2011-03-21 13:26";
var dt1 = dtStr.toDate("yyyy-MM-dd HH:mm");
Console.WriteLine(dt1.HasValue ? $"Parsed date: {dt1.Value.ToString()}" : "no valid date");
var dt2 = dtStr.toDate(new string[] { "yyyy-MM-dd HH:mm", "M/d/yyyy h:mm:ss tt" });
Console.WriteLine(dt2.HasValue ? $"Parsed date: {dt2.Value.ToString()}" : "no valid date");
int? year = dtStr?.toDate("yyyy-MM-dd HH:mm")?.Year;
Console.WriteLine(year.HasValue ? $"The year is: {year.Value.ToString()}" : "no valid year");
public static class Extensions
public static DateTime? toDate(this string dateTimeStr, string[] dateFmt)
const DateTimeStyles style = DateTimeStyles.AllowWhiteSpaces;
var dateInfo = System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat;
dateFmt=dateInfo.GetAllDateTimePatterns();
if (DateTime.TryParseExact(dateTimeStr, dateFmt,
CultureInfo.InvariantCulture, style, out dt)) result = dt;
public static DateTime? toDate(this string dateTimeStr, string dateFmt=null)
string[] dateFmtArr = dateFmt==null ? null : new string[] { dateFmt };
return toDate(dateTimeStr, dateFmtArr);