public static DateTime FromUnknown(string str) { str = ParseUtil.NormalizeSpace(str); Match match; // ... ago match = timeAgoRegexp.Match(str); if (match.Success) { var timeago = str; return(FromTimeAgo(timeago)); } // Today ... match = todayRegexp.Match(str); if (match.Success) { var time = str.Replace(match.Groups[0].Value, ""); DateTime dt = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified); dt += TimeSpan.Parse(time); return(dt); } // Yesterday ... match = yesterdayRegexp.Match(str); if (match.Success) { var time = str.Replace(match.Groups[0].Value, ""); DateTime dt = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified); dt += TimeSpan.Parse(time); dt -= TimeSpan.FromDays(1); return(dt); } // Tomorrow ... match = tomorrowRegexp.Match(str); if (match.Success) { var time = str.Replace(match.Groups[0].Value, ""); DateTime dt = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified); dt += TimeSpan.Parse(time); dt += TimeSpan.FromDays(1); return(dt); } // add missing year match = missingYearRegexp.Match(str); if (match.Success) { var date = match.Groups[0].Value; string newDate = date + "-" + DateTime.Now.Year.ToString(); str = str.Replace(date, newDate); } return(FromFuzzyTime(str)); }
public static Regex missingYearRegexp2 = new Regex(@"^(\d{1,2}\s+\w{3})\s+(\d{1,2}\:\d{1,2}.*)$", RegexOptions.Compiled); // 1 Jan 10:30 public static DateTime FromUnknown(string str, string format = null) { try { str = ParseUtil.NormalizeSpace(str); Match match; if (str.ToLower().Contains("now")) { return(DateTime.UtcNow); } // ... ago match = timeAgoRegexp.Match(str); if (match.Success) { var timeago = str; return(FromTimeAgo(timeago)); } // Today ... match = todayRegexp.Match(str); if (match.Success) { var time = str.Replace(match.Groups[0].Value, ""); DateTime dt = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified); dt += ParseTimeSpan(time); return(dt); } // Yesterday ... match = yesterdayRegexp.Match(str); if (match.Success) { var time = str.Replace(match.Groups[0].Value, ""); DateTime dt = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified); dt += ParseTimeSpan(time); dt -= TimeSpan.FromDays(1); return(dt); } // Tomorrow ... match = tomorrowRegexp.Match(str); if (match.Success) { var time = str.Replace(match.Groups[0].Value, ""); DateTime dt = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified); dt += ParseTimeSpan(time); dt += TimeSpan.FromDays(1); return(dt); } try { // try parsing the str as an unix timestamp var unixTimeStamp = long.Parse(str); return(UnixTimestampToDateTime(unixTimeStamp)); } catch (FormatException) { // it wasn't a timestamp, continue.... } // add missing year match = missingYearRegexp.Match(str); if (match.Success) { var date = match.Groups[1].Value; string newDate = DateTime.Now.Year.ToString() + "-" + date; str = str.Replace(date, newDate); } // add missing year 2 match = missingYearRegexp2.Match(str); if (match.Success) { var date = match.Groups[1].Value; var time = match.Groups[2].Value; str = date + " " + DateTime.Now.Year.ToString() + " " + time; } return(FromFuzzyTime(str, format)); } catch (Exception ex) { throw new Exception(string.Format("DateTime parsing failed for \"{0}\": {1}", str, ex.ToString())); } }
// converts a date/time string to a DateTime object using a GoLang layout public static DateTime ParseDateTimeGoLang(string date, string layout) { date = ParseUtil.NormalizeSpace(date); var pattern = layout; // year pattern = pattern.Replace("2006", "yyyy"); pattern = pattern.Replace("06", "yy"); // month pattern = pattern.Replace("January", "MMMM"); pattern = pattern.Replace("Jan", "MMM"); pattern = pattern.Replace("01", "MM"); // day pattern = pattern.Replace("Monday", "dddd"); pattern = pattern.Replace("Mon", "ddd"); pattern = pattern.Replace("02", "dd"); //pattern = pattern.Replace("_2", ""); // space padding not supported nativly by C#? pattern = pattern.Replace("2", "d"); // hours/minutes/seconds pattern = pattern.Replace("05", "ss"); pattern = pattern.Replace("15", "HH"); pattern = pattern.Replace("03", "hh"); pattern = pattern.Replace("3", "h"); pattern = pattern.Replace("04", "mm"); pattern = pattern.Replace("4", "m"); pattern = pattern.Replace("5", "s"); // month again pattern = pattern.Replace("1", "M"); // fractional seconds pattern = pattern.Replace(".0000", "ffff"); pattern = pattern.Replace(".000", "fff"); pattern = pattern.Replace(".00", "ff"); pattern = pattern.Replace(".0", "f"); pattern = pattern.Replace(".9999", "FFFF"); pattern = pattern.Replace(".999", "FFF"); pattern = pattern.Replace(".99", "FF"); pattern = pattern.Replace(".9", "F"); // AM/PM pattern = pattern.Replace("PM", "tt"); pattern = pattern.Replace("pm", "tt"); // not sure if this works // timezones // these might need further tuning //pattern = pattern.Replace("MST", ""); //pattern = pattern.Replace("Z07:00:00", ""); pattern = pattern.Replace("Z07:00", "'Z'zzz"); pattern = pattern.Replace("Z07", "'Z'zz"); //pattern = pattern.Replace("Z070000", ""); //pattern = pattern.Replace("Z0700", ""); pattern = pattern.Replace("Z07:00", "'Z'zzz"); pattern = pattern.Replace("Z07", "'Z'zz"); //pattern = pattern.Replace("-07:00:00", ""); pattern = pattern.Replace("-07:00", "zzz"); //pattern = pattern.Replace("-0700", "zz"); pattern = pattern.Replace("-07", "zz"); try { return(DateTime.ParseExact(date, pattern, CultureInfo.InvariantCulture)); } catch (FormatException ex) { throw new FormatException(string.Format("Error while parsing DateTime \"{0}\", using layout \"{1}\" ({2}): {3}", date, layout, pattern, ex.Message)); } }
public static DateTime FromUnknown(string str) { str = ParseUtil.NormalizeSpace(str); Match match; // ... ago match = timeAgoRegexp.Match(str); if (match.Success) { var timeago = str; return(FromTimeAgo(timeago)); } // Today ... match = todayRegexp.Match(str); if (match.Success) { var time = str.Replace(match.Groups[0].Value, ""); DateTime dt = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified); dt += ParseTimeSpan(time); return(dt); } // Yesterday ... match = yesterdayRegexp.Match(str); if (match.Success) { var time = str.Replace(match.Groups[0].Value, ""); DateTime dt = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified); dt += ParseTimeSpan(time); dt -= TimeSpan.FromDays(1); return(dt); } // Tomorrow ... match = tomorrowRegexp.Match(str); if (match.Success) { var time = str.Replace(match.Groups[0].Value, ""); DateTime dt = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified); dt += ParseTimeSpan(time); dt += TimeSpan.FromDays(1); return(dt); } try { // try parsing the str as an unix timestamp var unixTimeStamp = long.Parse(str); DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc); dt = dt.AddSeconds(unixTimeStamp).ToLocalTime(); return(dt); } catch (FormatException) { // it wasn't a timestamp, continue.... } // add missing year match = missingYearRegexp.Match(str); if (match.Success) { var date = match.Groups[0].Value; string newDate = date + "-" + DateTime.Now.Year.ToString(); str = str.Replace(date, newDate); } return(FromFuzzyTime(str)); }