Mastering DateTime Format in C#: A Comprehensive Guide of C# DateTime Format

DateTime is an important data type in C# that is used to represent dates and times. It is a versatile class that provides many ways to format dates and times. In this tutorial, we will explore the DateTime format in C#, including custom format, String.Format(), and ToString() methods. This a comprehensive guide about C# DateTime format. 

Understanding DateTime Format 
Before we dive into formatting DateTime in C#, it is important to understand the DateTime format. The DateTime format consists of two parts: date and time. The date part includes the day, month, and year, while the time part includes hours, minutes, seconds, and milliseconds. The DateTime format can be represented in many ways, such as "MM/dd/yyyy HH:mm:ss", "dd-MMM-yyyy h:mm tt", etc. A standard date and time format string uses a single character as the format specifier to define the text representation of a DateTime value. 

Following examples show usage of standard format specifiers in String.Format method and the resulting output.
String.Format("{0:t}", dt); // "4:05 PM" ShortTime
String.Format("{0:d}", dt); // "3/9/2008" ShortDate
String.Format("{0:T}", dt); // "4:05:07 PM" LongTime
String.Format("{0:D}", dt); // "Sunday, March 09, 2008" LongDate
String.Format("{0:f}", dt); // "Sunday, March 09, 2008 4:05 PM" LongDate+ShortTime
String.Format("{0:F}", dt); // "Sunday, March 09, 2008 4:05:07 PM" FullDateTime
String.Format("{0:g}", dt); // "3/9/2008 4:05 PM" ShortDate+ShortTime
String.Format("{0:G}", dt); // "3/9/2008 4:05:07 PM" ShortDate+LongTime
String.Format("{0:m}", dt); // "March 09" MonthDay
String.Format("{0:y}", dt); // "March, 2008" YearMonth
String.Format("{0:r}", dt); // "Sun, 09 Mar 2008 16:05:07 GMT" RFC1123
String.Format("{0:s}", dt); // "2008-03-09T16:05:07" SortableDateTime
String.Format("{0:u}", dt); // "2008-03-09 16:05:07Z" UniversalSortableDateTime
The format specifiers are: 
  • y (year) 
  • M (month) 
  • d (day) 
  • h (hour 12) 
  • H (hour 24) 
  • m (minute) 
  • s (second) 
  • f (second fraction) 
  • F (second fraction, trailing zeroes are trimmed) 
  • t (P.M or A.M) 
  • z (time zone) 

Custom DateTime Format
C# provides the DateTime.ToString() method that allows us to format DateTime using custom format strings. Custom format strings consist of one or more format specifiers that define how the date and time will be formatted. For example, to format the DateTime as "MM/dd/yyyy HH:mm:ss", we can use the following code. This will output the current date and time in the specified format.
DateTime now = DateTime.Now;
string formattedDateTime = now.ToString("MM/dd/yyyy HH:mm:ss");
Using String.Format() 
Another way to format DateTime in C# is to use the String.Format() method. String.Format() allows us to concatenate strings and format them using placeholders. The placeholders are denoted by curly braces {} and can contain format specifiers. For example, to format the DateTime as "Today is {0:dddd, MMMM d, yyyy}", we can use the following code. This will output the current date in the specified format.
DateTime now = DateTime.Now;
string formattedDateTime = String.Format("Today is {0:dddd, MMMM d, yyyy}", now);
Common DateTime Format Specifiers
C# provides a number of format specifiers that we can use to format DateTime. Some of the commonly used format specifiers are listed below: 
  • d: Short date pattern (e.g. "MM/dd/yyyy") 
  • D: Long date pattern (e.g. "dddd, MMMM dd, yyyy") 
  • t: Short time pattern (e.g. "h:mm tt") 
  • T: Long time pattern (e.g. "h:mm:ss tt") 
  • f: Full date/time pattern (short time) (e.g. "dddd, MMMM dd, yyyy h:mm tt") 
  • F: Full date/time pattern (long time) (e.g. "dddd, MMMM dd, yyyy h:mm:ss tt") 
  • g: General date/time pattern (short time) (e.g. "MM/dd/yyyy h:mm tt") 
  • G: General date/time pattern (long time) (e.g. "MM/dd/yyyy h:mm:ss tt") 
  • M: Month/day pattern (e.g. "MMMM dd") 
  • Y: Year/month pattern (e.g. "MMMM, yyyy") 

Following examples demonstrate how are the format specifiers rewritten to the output:
// create date time 2008-03-09 16:05:07.123
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);

String.Format("{0:y yy yyy yyyy}", dt); // "8 08 008 2008" year
String.Format("{0:M MM MMM MMMM}", dt); // "3 03 Mar March" month
String.Format("{0:d dd ddd dddd}", dt); // "9 09 Sun Sunday" day
String.Format("{0:h hh H HH}", dt); // "4 04 16 16" hour 12/24
String.Format("{0:m mm}", dt); // "5 05" minute
String.Format("{0:s ss}", dt); // "7 07" second
String.Format("{0:f ff fff ffff}", dt); // "1 12 123 1230" sec.fraction
String.Format("{0:F FF FFF FFFF}", dt); // "1 12 123 123" without zeroes
String.Format("{0:t tt}", dt); // "P PM" A.M. or P.M.
String.Format("{0:z zz zzz}", dt); // "-6 -06 -06:00" time zone
You can use also date separator / (slash) and time sepatator : (colon). These characters will be rewritten to characters defined in the current DateTimeFormatInfo.DateSeparator and DateTimeFormatInfo.TimeSeparator.
// date separator in german culture is "." (so "/" changes to ".")
String.Format("{0:d/M/yyyy HH:mm:ss}", dt); // "9/3/2008 16:05:07" - english (en-US)
String.Format("{0:d/M/yyyy HH:mm:ss}", dt); // "9.3.2008 16:05:07" - german (de-DE)
Here are some examples of custom date and time formatting:
// month/day numbers without/with leading zeroes
String.Format("{0:M/d/yyyy}", dt); // "3/9/2008"
String.Format("{0:MM/dd/yyyy}", dt); // "03/09/2008"

// day/month names
String.Format("{0:ddd, MMM d, yyyy}", dt); // "Sun, Mar 9, 2008"
String.Format("{0:dddd, MMMM d, yyyy}", dt); // "Sunday, March 9, 2008"

// two/four digit year
String.Format("{0:MM/dd/yy}", dt); // "03/09/08"
String.Format("{0:MM/dd/yyyy}", dt); // "03/09/2008"
In this tutorial, we have learned how to format DateTime in C#. We explored custom format strings, String.Format(), and common format specifiers. With this knowledge, you should be able to format DateTime in any way you need. 

Note: It's important to keep in mind the culture of your audience and application when formatting DateTime. The format of the DateTime may change depending on the location of the user, so it's important to test your code with different cultures and formats.