/// <summary> /// Converts a vague date composed of separate start and end date strings into a timespan in days since 30/12/1899. /// </summary> /// <param name="startDateString">Start date string.</param> /// <param name="endDateString">End date string.</param> /// <param name="dateType">Two-letter date format code as generated by the GetFormat method.</param> /// <param name="outputFormat">One of the output formats in the HLU.Date.DateType enumeration.</param> /// <returns></returns> public static int ToTimeSpanDays(string startDateString, string endDateString, string dateType, DateType outputFormat) { if (String.IsNullOrEmpty(dateType) || (dateType == VagueDate.ToCode(VagueDateTypes.Unknown))) { return(DateUnknown); } try { DateTimeFormatInfo dtFormatInfo = CultureInfo.CurrentCulture.DateTimeFormat; DateTime startDate; bool startDateOk = DateTime.TryParse(startDateString, dtFormatInfo, DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeLocal | DateTimeStyles.NoCurrentDateDefault, out startDate); DateTime endDate; bool endDateOk = DateTime.TryParse(endDateString, dtFormatInfo, DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeLocal | DateTimeStyles.NoCurrentDateDefault, out endDate); int year; string formatString = String.Empty; switch (outputFormat) { case DateType.Start: if (dateType.Length > 0) { formatString = dateType.Substring(0, 1); } switch (VagueDate.FromCode(formatString)) { case VagueDateTypes.StartDate: // "D" if (startDateOk) { return(startDate.Subtract(BaseDate).Days); } break; case VagueDateTypes.StartMonthAndYear: // "O" if (startDateOk) { return(startDate.Subtract(BaseDate).Days); } break; case VagueDateTypes.Year: // "Y" if (startDateOk) { return(new DateTime(startDate.Year, 1, 1).Subtract(BaseDate).Days); } else if (Int32.TryParse(startDateString, out year)) { return(new DateTime(year, 1, 1).Subtract(BaseDate).Days); } break; case VagueDateTypes.Season: // "P" if (!String.IsNullOrEmpty(startDateString)) { string[] splitArray = Regex.Split(startDateString, @"\s+"); if ((splitArray.Length != 2) || !Int32.TryParse(splitArray[1], out year)) { return(DateUnknown); // 9999; } var q = SeasonNames.Where(s => s.ToLower() == splitArray[0].ToLower()); if (q.Count() > 0) { string season = q.ElementAt(0); int seasonIx = System.Array.IndexOf(SeasonNames, season); if (seasonIx != -1) { return(SeasonStart(splitArray[0], year).Subtract(BaseDate).Days); } } } break; case VagueDateTypes.Unknown: // "U" default: return(DateUnknown); } break; case DateType.End: if (dateType.Length > 1) { formatString = dateType.Substring(dateType.Length - 1, 1); } switch (VagueDate.FromCode(formatString)) { case VagueDateTypes.StartDate: // "D" if (endDateOk) { return(endDate.Subtract(BaseDate).Days); } break; case VagueDateTypes.StartMonthAndYear: // "O" if (endDateOk) { return(endDate.Subtract(BaseDate).Days); } break; case VagueDateTypes.Year: // "Y" if (endDateOk) { return(new DateTime(endDate.Year, 1, 1).Subtract(BaseDate).Days); } else if (Int32.TryParse(endDateString, out year)) { return(new DateTime(year, 1, 1).Subtract(BaseDate).Days); } break; case VagueDateTypes.Season: // "P" if (!String.IsNullOrEmpty(endDateString)) { string[] splitArray = Regex.Split(endDateString, @"\s+"); if ((splitArray.Length != 2) || !Int32.TryParse(splitArray[1], out year)) { return(DateUnknown); // 9999; } var q = SeasonNames.Where(s => s.ToLower() == splitArray[0].ToLower()); if (q.Count() > 0) { string season = q.ElementAt(0); int seasonIx = System.Array.IndexOf(SeasonNames, season); return(SeasonEnd(season, year).Subtract(BaseDate).Days); } } break; case VagueDateTypes.Unknown: // "U" default: return(DateUnknown); } break; } } catch { } return(DateUnknown); // 9999 }
/// <summary> /// Creates a vague date string of a specified format from start and end dates. /// </summary> /// <param name="startDate">Start date.</param> /// <param name="endDate">End date.</param> /// <param name="dateType">Two-letter date format code as generated by the GetFormat method.</param> /// <param name="outputFormat">One of the output formats in the HLU.Date.DateType enumeration.</param> /// <returns>A vague date string in the format specified in the dateType parameter.</returns> public static string FromDate(DateTime startDate, DateTime endDate, string dateType, DateType outputFormat) { if (String.IsNullOrEmpty(dateType) || (dateType == VagueDate.ToCode(VagueDateTypes.Unknown))) { return(VagueDateTypes.Unknown.ToString()); } try { DateTimeFormatInfo dtFormatInfo = CultureInfo.CurrentCulture.DateTimeFormat; string formatString = String.Empty; switch (outputFormat) { case DateType.Start: if (dateType.Length > 0) { formatString = dateType.Substring(0, 1); } switch (VagueDate.FromCode(formatString)) { case VagueDateTypes.StartDate: // "D" return(startDate.ToShortDateString()); case VagueDateTypes.StartMonthAndYear: // "O" return(String.Format("{0} {1}", dtFormatInfo.MonthNames[startDate.Month - 1], startDate.Year)); case VagueDateTypes.Year: // "Y" return(startDate.Year.ToString()); case VagueDateTypes.Season: // "P" return(String.Format("{0}{1}", SeasonString(startDate), Delimiter)); case VagueDateTypes.Unknown: // "U" return(VagueDateTypes.Unknown.ToString()); } break; case DateType.End: if (dateType.Length > 1) { formatString = dateType.Substring(dateType.Length - 1, 1); } switch (VagueDate.FromCode(formatString)) { case VagueDateTypes.StartDate: // "D" return(endDate.ToShortDateString()); case VagueDateTypes.StartMonthAndYear: // "O" return(String.Format("{0} {1}", dtFormatInfo.MonthNames[endDate.Month - 1], endDate.Year)); case VagueDateTypes.Year: // "Y" return(endDate.Year.ToString()); case VagueDateTypes.Season: // "P" return(String.Format("{0}{1}", Delimiter, SeasonString(endDate))); case VagueDateTypes.Unknown: // "U" return(VagueDateTypes.Unknown.ToString()); } break; case DateType.Vague: if (dateType.Length > 0) { formatString = dateType.Substring(0, 1); } StringBuilder returnString = new StringBuilder(); switch (VagueDate.FromCode(formatString)) { case VagueDateTypes.StartDate: // "D" returnString.Append(startDate.ToShortDateString()); break; case VagueDateTypes.StartMonthAndYear: // "O" returnString.Append(String.Format("{0} {1}", dtFormatInfo.MonthNames[startDate.Month - 1], startDate.Year)); break; case VagueDateTypes.Year: // "Y" returnString.Append(startDate.Year.ToString()); break; case VagueDateTypes.Season: // "P" returnString.Append(SeasonString(startDate)); break; case VagueDateTypes.Unknown: // "U" break; } if ((endDate == startDate) || (dateType.Length < 2)) { return(returnString.ToString()); } formatString = dateType.Substring(dateType.Length - 1, 1); switch (VagueDate.FromCode(formatString)) { case VagueDateTypes.StartDate: // "D" return(returnString.Append(Delimiter).Append(endDate.ToShortDateString()).ToString()); case VagueDateTypes.StartMonthAndYear: // "O" return(returnString.Append(Delimiter).Append(String.Format("{0} {1}", dtFormatInfo.MonthNames[endDate.Month - 1], endDate.Year)).ToString()); case VagueDateTypes.Year: // "Y" return(returnString.Append(Delimiter).Append(endDate.Year).ToString()); case VagueDateTypes.Season: // "P" return(returnString.Append(Delimiter).Append(SeasonString(endDate)).ToString()); case VagueDateTypes.Unknown: // "U" if (returnString.Length == 0) { return(VagueDateTypes.Unknown.ToString()); } else { return(returnString.Append(Delimiter).ToString()); } } break; } } catch { } return(VagueDateTypes.Unknown.ToString()); }