Click here to Skip to main content
15,914,795 members
Articles / Programming Languages / C#
Article

C# DateTime Library

Rate me:
Please Sign up or sign in to vote.
3.53/5 (46 votes)
19 Dec 2005 320.5K   1.9K   102   41
Common DateTime routines for C#.

Introduction

I recently made the transition from Delphi to C#. I noticed that some of the datetime utilities that I used to use were not available in C#. So I recreated them. Hopefully this will save someone some time in the future.

The Code

C#
using System;
namespace Concepts2Code.Utilities
{
    /// <summary>
    /// Common DateTime Methods.
    /// </summary>
    /// 

    public enum Quarter
    {
        First = 1,
        Second = 2,
        Third = 3,
        Fourth = 4
    }

    public enum Month
    {
        January = 1,
        February = 2,
        March = 3,
        April = 4,
        May = 5,
        June = 6,
        July = 7,
        August = 8,
        September = 9,
        October = 10,
        November = 11,
        December = 12
    }

    public class DateUtilities
    {
        #region Quarters

        public static DateTime GetStartOfQuarter( int Year, Quarter Qtr )
        {
            if( Qtr == Quarter.First )    // 1st Quarter = January 1 to March 31
                return new DateTime( Year, 1, 1, 0, 0, 0, 0 );
            else if( Qtr == Quarter.Second ) // 2nd Quarter = April 1 to June 30
                return new DateTime( Year, 4, 1, 0, 0, 0, 0 );
            else if( Qtr == Quarter.Third ) // 3rd Quarter = July 1 to September 30
                return new DateTime( Year, 7, 1, 0, 0, 0, 0 );
            else // 4th Quarter = October 1 to December 31
                return new DateTime( Year, 10, 1, 0, 0, 0, 0 );
        }

        public static DateTime GetEndOfQuarter( int Year, Quarter Qtr )
        {
            if( Qtr == Quarter.First )    // 1st Quarter = January 1 to March 31
                return new DateTime( Year, 3, 
                       DateTime.DaysInMonth( Year, 3 ), 23, 59, 59, 999 );
            else if( Qtr == Quarter.Second ) // 2nd Quarter = April 1 to June 30
                return new DateTime( Year, 6, 
                       DateTime.DaysInMonth( Year, 6 ), 23, 59, 59, 999 );
            else if( Qtr == Quarter.Third ) // 3rd Quarter = July 1 to September 30
                return new DateTime( Year, 9, 
                       DateTime.DaysInMonth( Year, 9 ), 23, 59, 59, 999 );
            else // 4th Quarter = October 1 to December 31
                return new DateTime( Year, 12, 
                       DateTime.DaysInMonth( Year, 12 ), 23, 59, 59, 999 );
        }

        public static Quarter GetQuarter( Month Month )
        {
            if( Month <= Month.March )
            // 1st Quarter = January 1 to March 31
                return Quarter.First;
            else if( ( Month >= Month.April ) && ( Month <= Month.June ) )
            // 2nd Quarter = April 1 to June 30
                return Quarter.Second;
            else if( ( Month >= Month.July ) && ( Month <= Month.September ) )
            // 3rd Quarter = July 1 to September 30
                return Quarter.Third;
            else // 4th Quarter = October 1 to December 31
                return Quarter.Fourth;
        }

        public static DateTime GetEndOfLastQuarter()
        {                 
            if( (Month)DateTime.Now.Month <= Month.March )
            //go to last quarter of previous year
                return GetEndOfQuarter( DateTime.Now.Year - 1, Quarter.Fourth);
            else //return last quarter of current year
                return GetEndOfQuarter( DateTime.Now.Year, 
                  GetQuarter( (Month)DateTime.Now.Month));
        }

        public static DateTime GetStartOfLastQuarter()
        {
            if( (Month)DateTime.Now.Month <= Month.March )
            //go to last quarter of previous year
                return GetStartOfQuarter( DateTime.Now.Year - 1, Quarter.Fourth);
            else //return last quarter of current year
                return GetStartOfQuarter( DateTime.Now.Year, 
                  GetQuarter( (Month)DateTime.Now.Month));
        }

        public static DateTime GetStartOfCurrentQuarter()
        {
            return GetStartOfQuarter( DateTime.Now.Year, 
                   GetQuarter( (Month)DateTime.Now.Month ));
        }

        public static DateTime GetEndOfCurrentQuarter()
        {
            return GetEndOfQuarter( DateTime.Now.Year, 
                   GetQuarter( (Month)DateTime.Now.Month ));
        }
        #endregion

        #region Weeks
        public static DateTime GetStartOfLastWeek()
        {
            int DaysToSubtract = (int)DateTime.Now.DayOfWeek + 7;
            DateTime dt = 
              DateTime.Now.Subtract(System.TimeSpan.FromDays( DaysToSubtract ) );
            return new DateTime( dt.Year, dt.Month, dt.Day, 0, 0, 0, 0 );
        }

        public static DateTime GetEndOfLastWeek()
        {
            DateTime dt = GetStartOfLastWeek().AddDays(6);
            return new DateTime( dt.Year, dt.Month, dt.Day, 23, 59, 59, 999 );
        }

        public static DateTime GetStartOfCurrentWeek()
        {
            int DaysToSubtract = (int)DateTime.Now.DayOfWeek ;
            DateTime dt = 
              DateTime.Now.Subtract( System.TimeSpan.FromDays( DaysToSubtract ) );
            return new DateTime( dt.Year, dt.Month, dt.Day, 0, 0, 0, 0 );
        }

        public static DateTime GetEndOfCurrentWeek()
        {
            DateTime dt = GetStartOfCurrentWeek().AddDays(6);
            return new DateTime( dt.Year, dt.Month, dt.Day, 23, 59, 59, 999 );
        }
        #endregion

        #region Months

        public static DateTime GetStartOfMonth( Month Month, int Year )
        {
             return new DateTime( Year, (int)Month, 1, 0, 0, 0, 0 );
        }

        public static DateTime GetEndOfMonth( Month Month, int Year )
        {
            return new DateTime( Year, (int)Month, 
               DateTime.DaysInMonth( Year, (int)Month ), 23, 59, 59, 999 );
        }

        public static DateTime GetStartOfLastMonth()
        {
            if( DateTime.Now.Month == 1 )
                return GetStartOfMonth( 12, DateTime.Now.Year - 1);
            else
                return GetStartOfMonth( DateTime.Now.Month -1, DateTime.Now.Year );
        }

        public static DateTime GetEndOfLastMonth()
        {
            if( DateTime.Now.Month == 1 )
                return GetEndOfMonth( 12, DateTime.Now.Year - 1);
            else
                return GetEndOfMonth( DateTime.Now.Month -1, DateTime.Now.Year );
        }

        public static DateTime GetStartOfCurrentMonth()
        {
            return GetStartOfMonth( DateTime.Now.Month, DateTime.Now.Year );
        }

        public static DateTime GetEndOfCurrentMonth()
        {
            return GetEndOfMonth( DateTime.Now.Month, DateTime.Now.Year );
        }
        #endregion

        #region Years
        public static DateTime GetStartOfYear( int Year )
        {
            return new DateTime( Year, 1, 1, 0, 0, 0, 0 );
        }

        public static DateTime GetEndOfYear( int Year )
        {
            return new DateTime( Year, 12, 
              DateTime.DaysInMonth( Year, 12 ), 23, 59, 59, 999 );
        }

        public static DateTime GetStartOfLastYear()
        {
            return GetStartOfYear( DateTime.Now.Year - 1 );
        }

        public static DateTime GetEndOfLastYear()
        {
            return GetEndOfYear( DateTime.Now.Year - 1 );
        }

        public static DateTime GetStartOfCurrentYear()
        {
            return GetStartOfYear( DateTime.Now.Year );
        }

        public static DateTime GetEndOfCurrentYear()
        {
            return GetEndOfYear( DateTime.Now.Year );
        }
        #endregion        

        #region Days
        public static DateTime GetStartOfDay( DateTime date )
        {
            return new DateTime( date.Year, date.Month, date.Day, 0, 0, 0, 0 );
        }

        public static DateTime GetEndOfDay( DateTime date )
        {
            return new DateTime( date.Year, date.Month, 
                                 date.Day, 23, 59, 59, 999 );
        }
        #endregion
      }
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Software Developer (Senior) Concepts2Code
United States United States
Michael is the co-founder and master consultant for Concepts2Code, a software consulting company based in Buffalo, New York. He's been programming since the early 1990's. His vast programming experience includes VB, Delphi, C#, ASP, ASP.NET, Ruby on Rails, Coldfusion and PHP. Michael also is a Microsoft Certified Application Developer and a Certified Technology Specialist for SQL Server.

Visit his blog.

Comments and Discussions

 
GeneralFiscal Year vs Calendar Year Pin
Darren Pruitt14-Mar-05 4:23
Darren Pruitt14-Mar-05 4:23 
GeneralRe: Fiscal Year vs Calendar Year Pin
Jani Giannoudis16-Mar-11 21:09
mvaJani Giannoudis16-Mar-11 21:09 
GeneralC# standards Pin
Drew Noakes11-Mar-05 0:12
Drew Noakes11-Mar-05 0:12 
GeneralImprove readability... Pin
Alexander Turlov9-Mar-05 14:14
Alexander Turlov9-Mar-05 14:14 
GeneralRe: Improve readability... Pin
Drew Noakes11-Mar-05 0:01
Drew Noakes11-Mar-05 0:01 
GeneralSome useful methods else... Pin
Alexander Turlov9-Mar-05 14:02
Alexander Turlov9-Mar-05 14:02 
GeneralUNIX-like timestamp conversions Pin
Ionut FIlip7-Mar-05 19:45
Ionut FIlip7-Mar-05 19:45 
GeneralRe: UNIX-like timestamp conversions Pin
Richard Deeming9-Mar-05 2:45
mveRichard Deeming9-Mar-05 2:45 
A couple of simplifications:
  1. The class should be marked as sealed, since you don't want anyone to inherit from it;
  2. Since the exceptions are indicating that the argument is outside of the acceptable range, you should throw an ArgumentOutOfRangeException instead of the more generic ArgumentException;
  3. The Epoch property could simply be implemented as:
    public static readonly DateTime Epoch = new DateTime(1970, 1, 1);
  4. In keeping with the DateTime class, it would probably be a good idea to expose a UtcNow property as well as the Now property;
  5. The FromUnix method converts the seconds to years and seconds before passing them to the TimeSpan constructor. The constructor then converts these values back to a number of ticks. It would be much simpler to use the constructor which accepts a number of ticks, i.e.:
    return Epoch + new TimeSpan(timestamp * TimeSpan.TicksPerSecond);


C#
public sealed class UnixTime
{
    public static readonly DateTime MinValue = new DateTime(1970, 1, 1);
    
    /// <summary>
    /// Convert a UNIX timestamp to a DateTime object
    /// </summary>
    /// <param name="seconds">UNIX timestamp to convert from</param>
    /// <returns>The converted DateTime object</returns>
    public static DateTime FromUnix(long seconds)
    {
        if (seconds < 0) 
            throw new ArgumentOutOfRangeException("seconds");
        
        return MinValue + new TimeSpan(seconds * TimeSpan.TicksPerSecond);
    }
    
    /// <summary>
    /// Convert a DateTime object to a UNIX timestamp
    /// </summary>
    /// <param name="value">The DateTime to convert from</param>
    /// <returns>The converted UNIX timestamp</returns>
    public static long ToUnix(DateTime value)
    {
        if (value < MinValue)
            throw new ArgumentOutOfRangeException("value");
        
        return (long)(value - MinValue).TotalSeconds;
    }
    
    /// <summary>
    /// Returns the current timestamp
    /// </summary>
    public static long Now
    {
        get { return ToUnix(DateTime.Now); }
    }
    
    /// <summary>
    /// Returns the current UTC timestamp
    /// </summary>
    public static long UtcNow
    {
        get { return ToUnix(DateTime.UtcNow); }
    }
    
    private UnixTime() {}
}



"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
GeneralAnother simplification Pin
mav.northwind1-Mar-05 0:42
mav.northwind1-Mar-05 0:42 
GeneralSimplification idea... Pin
Marc Brooks28-Feb-05 10:54
Marc Brooks28-Feb-05 10:54 
GeneralConfused Pin
Robert Rohde28-Feb-05 6:53
Robert Rohde28-Feb-05 6:53 
GeneralRe: Confused Pin
mceranski28-Feb-05 8:54
mceranski28-Feb-05 8:54 
GeneralRe: Confused Pin
Drew Noakes11-Mar-05 0:16
Drew Noakes11-Mar-05 0:16 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.