/// <summary>
 /// Singularizes a word
 /// </summary>
 /// <param name="Word">Word to singularize</param>
 /// <param name="Culture">
 /// Culture info used to singularize the word (defaults to current culture)
 /// </param>
 /// <returns>The word singularized</returns>
 public static string Singularize(this string Word, CultureInfo Culture = null)
 {
     if (string.IsNullOrEmpty(Word))
         return "";
     Culture = Culture.Check(CultureInfo.CurrentCulture);
     return PluralizationService.CreateService(Culture).Singularize(Word);
 }
 /// <summary>
 /// Gets the number of days left in the time frame specified based on the date
 /// </summary>
 /// <param name="Date">Date</param>
 /// <param name="TimeFrame">Time frame to calculate the number of days left</param>
 /// <param name="Culture">Culture to use for calculating (defaults to the current culture)</param>
 /// <param name="StartOfQuarter1">Start of the first quarter</param>
 /// <returns>The number of days left in the time frame</returns>
 public static int DaysLeftIn(this DateTime Date, TimeFrame TimeFrame, DateTime StartOfQuarter1, CultureInfo Culture = null)
 {
     if (TimeFrame != TimeFrame.Quarter)
     {
         return(Date.DaysLeftIn(TimeFrame, Culture));
     }
     Culture = Culture.Check(CultureInfo.CurrentCulture);
     return(Date.DaysIn(TimeFrame.Quarter, StartOfQuarter1, Culture) - (Date.DayOfYear - StartOfQuarter1.DayOfYear));
 }
 /// <summary>
 /// Beginning of a specific time frame
 /// </summary>
 /// <param name="Date">Date to base off of</param>
 /// <param name="TimeFrame">Time frame to use</param>
 /// <param name="Culture">Culture to use for calculating (defaults to the current culture)</param>
 /// <returns>The beginning of a specific time frame</returns>
 public static DateTime BeginningOf(this DateTime Date, TimeFrame TimeFrame, CultureInfo Culture = null)
 {
     Culture = Culture.Check(CultureInfo.CurrentCulture);
     if (TimeFrame == TimeFrame.Day)
     {
         return(Date.Date);
     }
     if (TimeFrame == TimeFrame.Week)
     {
         return(Date.AddDays(Culture.DateTimeFormat.FirstDayOfWeek - Date.DayOfWeek).Date);
     }
     if (TimeFrame == TimeFrame.Month)
     {
         return(new DateTime(Date.Year, Date.Month, 1));
     }
     if (TimeFrame == TimeFrame.Quarter)
     {
         return(Date.BeginningOf(TimeFrame.Quarter, Date.BeginningOf(TimeFrame.Year, Culture), Culture));
     }
     return(new DateTime(Date.Year, 1, 1));
 }
 /// <summary>
 /// End of a specific time frame
 /// </summary>
 /// <param name="Date">Date to base off of</param>
 /// <param name="TimeFrame">Time frame to use</param>
 /// <param name="Culture">Culture to use for calculating (defaults to the current culture)</param>
 /// <param name="StartOfQuarter1">Start of the first quarter</param>
 /// <returns>The end of a specific time frame (TimeFrame.Day is the only one that sets the time to 12:59:59 PM, all else are the beginning of the day)</returns>
 public static DateTime EndOf(this DateTime Date, TimeFrame TimeFrame, DateTime StartOfQuarter1, CultureInfo Culture = null)
 {
     if (TimeFrame != TimeFrame.Quarter)
     {
         return(Date.EndOf(TimeFrame, Culture));
     }
     Culture = Culture.Check(CultureInfo.CurrentCulture);
     if (Date.Between(StartOfQuarter1, StartOfQuarter1.AddMonths(3).AddDays(-1).EndOf(TimeFrame.Day, Culture)))
     {
         return(StartOfQuarter1.AddMonths(3).AddDays(-1).Date);
     }
     else if (Date.Between(StartOfQuarter1.AddMonths(3), StartOfQuarter1.AddMonths(6).AddDays(-1).EndOf(TimeFrame.Day, Culture)))
     {
         return(StartOfQuarter1.AddMonths(6).AddDays(-1).Date);
     }
     else if (Date.Between(StartOfQuarter1.AddMonths(6), StartOfQuarter1.AddMonths(9).AddDays(-1).EndOf(TimeFrame.Day, Culture)))
     {
         return(StartOfQuarter1.AddMonths(9).AddDays(-1).Date);
     }
     return(StartOfQuarter1.AddYears(1).AddDays(-1).Date);
 }
 /// <summary>
 /// End of a specific time frame
 /// </summary>
 /// <param name="Date">Date to base off of</param>
 /// <param name="TimeFrame">Time frame to use</param>
 /// <param name="Culture">Culture to use for calculating (defaults to the current culture)</param>
 /// <returns>The end of a specific time frame (TimeFrame.Day is the only one that sets the time to 12:59:59 PM, all else are the beginning of the day)</returns>
 public static DateTime EndOf(this DateTime Date, TimeFrame TimeFrame, CultureInfo Culture = null)
 {
     Culture = Culture.Check(CultureInfo.CurrentCulture);
     if (TimeFrame == TimeFrame.Day)
     {
         return(new DateTime(Date.Year, Date.Month, Date.Day, 23, 59, 59));
     }
     if (TimeFrame == TimeFrame.Week)
     {
         return(Date.BeginningOf(TimeFrame.Week, Culture).AddDays(6));
     }
     if (TimeFrame == TimeFrame.Month)
     {
         return(Date.AddMonths(1).BeginningOf(TimeFrame.Month, Culture).AddDays(-1).Date);
     }
     if (TimeFrame == TimeFrame.Quarter)
     {
         return(Date.EndOf(TimeFrame.Quarter, Date.BeginningOf(TimeFrame.Year, Culture), Culture));
     }
     return(new DateTime(Date.Year, 12, 31));
 }
 /// <summary>
 /// Gets the number of days left in the time frame specified based on the date
 /// </summary>
 /// <param name="Date">Date</param>
 /// <param name="TimeFrame">Time frame to calculate the number of days left</param>
 /// <param name="Culture">Culture to use for calculating (defaults to the current culture)</param>
 /// <returns>The number of days left in the time frame</returns>
 public static int DaysLeftIn(this DateTime Date, TimeFrame TimeFrame, CultureInfo Culture = null)
 {
     Culture = Culture.Check(CultureInfo.CurrentCulture);
     if (TimeFrame == TimeFrame.Day)
     {
         return(1);
     }
     if (TimeFrame == TimeFrame.Week)
     {
         return(7 - ((int)Date.DayOfWeek + 1));
     }
     if (TimeFrame == TimeFrame.Month)
     {
         return(Date.DaysIn(TimeFrame.Month, Culture) - Date.Day);
     }
     if (TimeFrame == TimeFrame.Quarter)
     {
         return(Date.DaysIn(TimeFrame.Quarter, Culture) - (Date.DayOfYear - Date.BeginningOf(TimeFrame.Quarter, Culture).DayOfYear));
     }
     return(Date.DaysIn(TimeFrame.Year, Culture) - Date.DayOfYear);
 }
 /// <summary>
 /// Gets the number of days in the time frame specified based on the date
 /// </summary>
 /// <param name="Date">Date</param>
 /// <param name="TimeFrame">Time frame to calculate the number of days from</param>
 /// <param name="Culture">Culture to use for calculating (defaults to the current culture)</param>
 /// <returns>The number of days in the time frame</returns>
 public static int DaysIn(this DateTime Date, TimeFrame TimeFrame, CultureInfo Culture = null)
 {
     Culture = Culture.Check(CultureInfo.CurrentCulture);
     if (TimeFrame == TimeFrame.Day)
     {
         return(1);
     }
     if (TimeFrame == TimeFrame.Week)
     {
         return(7);
     }
     if (TimeFrame == TimeFrame.Month)
     {
         return(Culture.Calendar.GetDaysInMonth(Date.Year, Date.Month));
     }
     if (TimeFrame == TimeFrame.Quarter)
     {
         return(Date.EndOf(TimeFrame.Quarter, Culture).DayOfYear - Date.BeginningOf(TimeFrame.Quarter, Culture).DayOfYear);
     }
     return(Culture.Calendar.GetDaysInYear(Date.Year));
 }