Mega Code Archive

 
Categories / C# / Date Time
 

Date and time To Words

#region License // Copyright (c) 2007 James Newton-King // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Globalization; namespace Newtonsoft.Utilities.Text {     public class FormatUtils     {         private static readonly string[] fuzzyHours = new string[] {          "midnight", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "noon", "one", "two", "three",          "four", "five", "six", "seven", "eight", "nine", "ten", "eleven"      };         private static readonly string[] fuzzyMinutes = new string[] { "five", "ten", "a quarter", "twenty", "twenty five", "half" };         public static string DateTimeToWords(DateTime date)         {             return DateTimeToWords(date, DateTime.Now);         }         public static string DateTimeToWords(DateTime dateTime, DateTime currentDate)         {             string result;             TimeSpan t1 = new TimeSpan(currentDate.Ticks);             TimeSpan t2 = new TimeSpan(dateTime.Ticks);             int daysElapsed = t1.Days - t2.Days;             if (daysElapsed < -7 || daysElapsed >= 14)                 result = DateToWords(dateTime, currentDate);             else if (daysElapsed == 0)                 result = "this " + GetPeriod(dateTime.Hour);             else                 result = DateToWords(dateTime, currentDate) + " " + GetPeriod(dateTime.Hour);             return (result + " at " + TimeToWords(dateTime));         }         public static string DateToWords(DateTime date)         {             return DateToWords(date, DateTime.Now);         }         public static string DateToWords(DateTime date, DateTime currentDate)         {             TimeSpan t1 = new TimeSpan(currentDate.Ticks);             TimeSpan t2 = new TimeSpan(date.Ticks);             int daysElapsed = t1.Days - t2.Days;             if (daysElapsed < -1 && daysElapsed >= -7)                 return ("next " + date.ToString("dddd"));             if (daysElapsed == -1)                 return "tomorrow";             if (daysElapsed == 0)                 return "today";             if (daysElapsed == 1)                 return "yesterday";             if (daysElapsed > 1 && daysElapsed < 7)                 return date.ToString("dddd");             if (daysElapsed >= 7 && daysElapsed < 14)                 return "last " + date.ToString("dddd");             return               (date.ToString("MMMM") + " " + GetOrdinal(date.Day) +                ((date.Year != currentDate.Year) ? (" " + date.ToString("yyyy")) : string.Empty));         }         public static string GetOrdinal(int value)         {             string[] _suffixes = new string[] { "th", "st", "nd", "rd" };             int tenth = value % 10;             if (tenth >= _suffixes.Length)             {                 return _suffixes[0];             }             else             {                 // special case for 11, 12, 13                 int hundredth = value % 100;                 if (hundredth >= 11 && hundredth <= 13)                     return _suffixes[0];                 return _suffixes[tenth];             }         }         private static string GetPeriod(int hour)         {             if (hour > 18)                 return "evening";             if (hour > 12)                 return "afternoon";             if (hour > 3)                 return "morning";             return "night";         }         public static string TimeToWords(DateTime time)         {             string result;             int minutes = time.Minute;             int hours = time.Hour;             bool toHour = false;             int remainder = time.Minute % 5;             if (remainder < 3)                 minutes -= remainder;             else                 minutes += 5 - remainder;             if (minutes > 30)             {                 hours = (hours + 1) % 24;                 minutes = 60 - minutes;                 toHour = true;             }             if (minutes != 0)                 result = fuzzyMinutes[minutes / 6] + " " + (toHour ? "to" : "past") + " " + fuzzyHours[hours];             else                 result = fuzzyHours[hours] + ((hours != 0 && hours != 12) ? " o'clock" : string.Empty);             if (hours > 0 && hours < 12)                 return result + " am";             if (hours > 12)                 result = result + " pm";             return result;         }     } }