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 &amp;&amp; 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 &amp;&amp; daysElapsed < 7)
                return date.ToString("dddd");

            if (daysElapsed >= 7 &amp;&amp; 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&#91;&#93; _suffixes = new string&#91;&#93; { "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 &amp;&amp; hundredth <= 13)
                    return _suffixes&#91;0&#93;;

                return _suffixes&#91;tenth&#93;;
            }
        }
        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 &amp;&amp; hours != 12) ? " o&#039;clock" : string.Empty);

            if (hours > 0 &amp;&amp; hours < 12)
                return result + " am";

            if (hours > 12)
                result = result + " pm";

            return result;
        }
    }
}

   
     


Get the week number

   
 

//Octavalent Extension Methods
//http://sdfasdf.codeplex.com/
//Library of extension methods for .Net create by Octavalent (www.octavalent.nl)
using System;

namespace System.OctavalentExtensions
{
    public static class DateTimeExtensions
    {
        #region Week
        public static int GetWeekNumber(this DateTime date)
        {
            // Updated 2004.09.27. Cleaned the code and fixed abug. Compared the algorithm with
            // code published here . Tested code successfully against the other algorithm 
            // for all dates in all years between 1900 and 2100.
            // Thanks to Marcus Dahlberg for pointing out the deficient logic.

            // Calculates the ISO 8601 Week Number
            // In this scenario the first day of the week is monday, 
            // and the week rule states that:
            // [...] the first calendar week of a year is the one 
            // that includes the first Thursday of that year and 
            // [...] the last calendar week of a calendar year is 
            // the week immediately preceding the first 
            // calendar week of the next year.
            // The first week of the year may thus start in the 
            // preceding year

            const int JAN = 1;
            const int DEC = 12;
            const int LASTDAYOFDEC = 31;
            const int FIRSTDAYOFJAN = 1;
            const int THURSDAY = 4;
            bool ThursdayFlag = false;

            // Get the day number since the beginning of the year
            int DayOfYear = date.DayOfYear;

            // Get the numeric weekday of the first day of the 
            // year (using sunday as FirstDay)
            var StartWeekDayOfYear =
                (int) (new DateTime(date.Year, JAN, FIRSTDAYOFJAN)).DayOfWeek;
            var EndWeekDayOfYear =
                (int) (new DateTime(date.Year, DEC, LASTDAYOFDEC)).DayOfWeek;

            // Compensate for the fact that we are using monday
            // as the first day of the week
            if (StartWeekDayOfYear == 0)
                StartWeekDayOfYear = 7;
            if (EndWeekDayOfYear == 0)
                EndWeekDayOfYear = 7;

            // Calculate the number of days in the first and last week
            int DaysInFirstWeek = 8 - (StartWeekDayOfYear);

            // If the year either starts or ends on a thursday it will have a 53rd week
            if (StartWeekDayOfYear == THURSDAY || EndWeekDayOfYear == THURSDAY)
                ThursdayFlag = true;

            // We begin by calculating the number of FULL weeks between the start of the year and
            // our date. The number is rounded up, so the smallest possible value is 0.
            var FullWeeks = (int) Math.Ceiling((DayOfYear - (DaysInFirstWeek))/7.0);

            int WeekNumber = FullWeeks;

            // If the first week of the year has at least four days, then the actual week number for our date
            // can be incremented by one.
            if (DaysInFirstWeek >= THURSDAY)
                WeekNumber = WeekNumber + 1;

            // If week number is larger than week 52 (and the year doesn&#039;t either start or end on a thursday)
            // then the correct week number is 1.
            if (WeekNumber > 52 &amp;&amp; !ThursdayFlag)
                WeekNumber = 1;

            // If week number is still 0, it means that we are trying to evaluate the week number for a
            // week that belongs in the previous year (since that week has 3 days or less in our date&#039;s year).
            // We therefore make a recursive call using the last day of the previous year.
            if (WeekNumber == 0)
                WeekNumber = new DateTime(date.Year - 1, DEC, LASTDAYOFDEC).GetWeekNumber();
            return WeekNumber;
        }

        #endregion

    }
}

   
     


Add week to a DateTime

   
 
//Octavalent Extension Methods
//http://sdfasdf.codeplex.com/
//Library of extension methods for .Net create by Octavalent (www.octavalent.nl)

using System;
    public static class DateTimeExtensions
    {

        public static DateTime AddWeek(this DateTime dateTime, int count)
        {
            return dateTime.AddDays(7*count);
        }
   }

   
     


Get Day Of Week

   
 

//Octavalent Extension Methods
//http://sdfasdf.codeplex.com/
//Library of extension methods for .Net create by Octavalent (www.octavalent.nl)
using System;

    public static class DateTimeExtensions
    {

        public static int GetDayOfWeek(this DateTime dt)
        {
            if (dt.DayOfWeek == DayOfWeek.Monday) return 1;
            if (dt.DayOfWeek == DayOfWeek.Tuesday) return 2;
            if (dt.DayOfWeek == DayOfWeek.Wednesday) return 3;
            if (dt.DayOfWeek == DayOfWeek.Thursday) return 4;
            if (dt.DayOfWeek == DayOfWeek.Friday) return 5;
            if (dt.DayOfWeek == DayOfWeek.Saturday) return 6;
            if (dt.DayOfWeek == DayOfWeek.Sunday) return 7;
            return 0;
        }
   }

   
     


Add Business Days

//Octavalent Extension Methods
//http://sdfasdf.codeplex.com/
//Library of extension methods for .Net create by Octavalent (www.octavalent.nl)
using System;

public static class DateTimeExtensions
{

public static DateTime AddBusinessDays(this DateTime date, int days)
{
int sign = Math.Sign(days);
int unsignedDays = Math.Abs(days);
for (int i = 0; i < unsignedDays; i++) { do { date = date.AddDays(sign); } while (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday); } return date; } } [/csharp]

Return true if the number of seconds has elapsed since the last check

   
 

// crudwork
// Copyright 2004 by Steve T. Pham (http://www.crudwork.com)
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with This program.  If not, see <http://www.gnu.org/licenses/>.

using System;
using System.Collections.Generic;
using System.Text;

namespace crudwork.Utilities
{
  /// <summary>
  /// Date Utility
  /// </summary>
  public class DateUtil
  {
    /// <summary>
    /// create new instance with default attributes
    /// </summary>
    public DateUtil()
    {
    }





    #region HasElapsed method
    private DateTime? then = null;

    /// <summary>
    /// <para>return true if the number of seconds has elapsed since the last check; otherwise return false.</para>
    /// <para>Use this method to raise a status report event to the GUI (for example, every 1 second) to prevent
    /// clogging the message pump.</para>
    /// </summary>
    /// <param name="seconds">specify number of seconds to check</param>
    /// <returns></returns>
    public bool HasElapsed(double seconds)
    {
      return HasElapsed(seconds, true);
    }

    /// <summary>
    /// <para>return true if the number of seconds has elapsed since the last check; otherwise return false.</para>
    /// <para>Use this method to raise a status report event to the GUI (for example, every 1 second) to prevent
    /// clogging the message pump.</para>
    /// </summary>
    /// <param name="seconds">specify number of seconds to check</param>
    /// <param name="mark">set true to mark the time if time has elapsed; or set false to do a test only</param>
    /// <returns></returns>
    public bool HasElapsed(double seconds, bool mark)
    {
      var now = DateTime.Now;

      if (!then.HasValue)
      {
        then = now;
        return false;  // return false, because this is the very first check
      }

      if (then.Value.AddSeconds(seconds) >= now)
        return false;  // the # of seconds has NOT elapsed...

      // yes, it has. mark new time for next check
      if (mark)
        then = now;

      return true;
    }
    #endregion
  }
}