Exemplo n.º 1
0
        /// <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
        }
Exemplo n.º 2
0
        /// <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());
        }