Date and Time format strings in .NET – Understanding format strings

Date and Time format strings come in two flavors – standard and custom.

Whenever these are used, the CultureInfo that is used with them comes into play. If an IFormatProvider is not specified, the CultureInfo assigned to the current thread is used.

Standard format strings

These are all single character format specifiers – they each can be thought of as representing longer, culture sensitive custom format strings.

Any format string that contains more than one character (including white space) is considered to be a custom format specifier.

A FormatException will be thrown if the format specifier is not one of the known ones (listed in the table below):

Format specifier Description
“d” Short date pattern
“D” Long date pattern
“f” Full date/time pattern (short time)
“F” Full date/time pattern (long time)
“g” General date/time pattern (short time)
“G” General date/time pattern (long time)
“M”, “m” Month/day pattern
“O”, “o” Round-trip date/time pattern
“R”, “r” RFC1123 pattern
“s” Sortable date/time pattern
“t” Short time pattern
“T” Long time pattern
“u” Universal sortable date/time pattern
“U” Universal full date/time pattern
“Y”, “y” Year month pattern

Take a look at the documentation for more detail.

Standard format strings are simple to use – when formatting a DateTime as a string or parsing a string into a DateTime (using ParseExact or TryParseExact).

Formatting examples:

DateTime.Now.ToString("f");
// 13 December 2011 19:35

DateTime.Now.ToString("f", CultureInfo.GetCultureInfo("he-IL"));
// יום שלישי 13 דצמבר 2011 19:35

DateTime.Now.ToString("D");
// 13 December 2011

DateTime.Now.ToString("D", CultureInfo.GetCultureInfo("ru-RU"));
// 13 декабря 2011 г.

Parsing examples (really just the opposite of the above):

DateTime.ParseExact("13 December 2011 19:35", "f", 
                    CultureInfo.GetCultureInfo("en-GB"))

DateTime.ParseExact("יום שלישי 13 דצמבר 2011 19:35", "f", 
                    CultureInfo.GetCultureInfo("he-IL"))

DateTime.ParseExact("13 December 2011", "D", 
                    CultureInfo.GetCultureInfo("en-GB"))

DateTime.ParseExact("13 декабря 2011 г.", "D", 
                    CultureInfo.GetCultureInfo("ru-RU"));

Custom format strings

Any string that contains more than one character will be considered to be a custom format string.

Custom format strings allow you to exactly match and parse any string representing a date and to convert a DateTime to any custom date string for display. They provide the most flexibility in parsing and outputting but are more complex to understand, construct and use than standard format strings.

All characters are allowed in the format string and each would be interpreted unchanged, unless it is one of the following format specifiers:

Format specifier Description
“d” The day of the month, from 1 through 31
“dd” The day of the month, from 01 through 31
“ddd” The abbreviated name of the day of the week
“dddd” The full name of the day of the week
“f” The tenths of a second in a date and time value
“ff” The hundredths of a second in a date and time value
“fff” The milliseconds in a date and time value
“ffff” The ten thousandths of a second in a date and time value
“fffff” The hundred thousandths of a second in a date and time value
“ffffff” The millionths of a second in a date and time value
“fffffff” The ten millionths of a second in a date and time value
“F” If non-zero, the tenths of a second in a date and time value
“FF” If non-zero, the hundredths of a second in a date and time value
“FFF” If non-zero, the milliseconds in a date and time value
“FFFF” If non-zero, the ten thousandths of a second in a date and time value
“FFFFF” If non-zero, the hundred thousandths of a second in a date and time value
“FFFFFF” If non-zero, the millionths of a second in a date and time value
“FFFFFFF” If non-zero, the ten millionths of a second in a date and time value
“g”, “gg” The period or era
“h” The hour, using a 12-hour clock from 1 to 12
“hh” The hour, using a 12-hour clock from 01 to 12
“H” The hour, using a 24-hour clock from 0 to 23
“HH” The hour, using a 24-hour clock from 00 to 23
“K” Time zone information
“m” The minute, from 0 through 59
“mm” The minute, from 00 through 59
“M” The month, from 1 through 12
“MM” The month, from 01 through 12
“MMM” The abbreviated name of the month
“MMMM” The full name of the month
“s” The second, from 0 through 59
“ss” The second, from 00 through 59
“t” The first character of the AM/PM designator
“tt” The AM/PM designator
“y” The year, from 0 to 99
“yy” The year, from 00 to 99
“yyy” The year, with a minimum of three digits
“yyyy” The year as a four-digit number
“yyyyy” The year as a five-digit number
“z” Hours offset from UTC, with no leading zeros
“zz” Hours offset from UTC, with a leading zero for a single-digit value
“zzz” Hours and minutes offset from UTC
“:” The time separator
“/” The date separator
“string”, ‘string’ Literal string delimiter
% Defines the following character as a custom format specifier
\ The escape character
Any other character The character is copied to the result string unchanged

Several of these merit special discussion:

“:” – the time separator

When “:” appears in a custom format string, is gets replaced with the time separator defined in the CultureInfo being used. For example, in the “it-IT” culture, the time separator is a “.”.

“/” – the date separator

When “/” appears in a custom format string, is gets replaced with the date separator defined in the CultureInfo being used. For example, in the “ar-DZ” culture, the date separator is a “-“.

“string”, ‘string’ – the literal string delimiter

You can use single and double quotes as literal string delimiters within a format string – any such delimited string within a format string would appear verbatim in the string being parsed or output.

“\” – the escape character

When “\” appears in a custom format string, it simply escapes the next character so it does not get interpreted as a format specifier. For example, if the letter s appears in the string to be parsed, “\s” would represent it for parsing to ensure it does not get interpreted as the single character seconds custom format specifier.

“%” – precedes a single character custom format specifier

If you wish to use a single character custom format specifier you have several choices – prepend or append a space to it to ensure that it is not interpreted as a standard format string (otherwise it will be and if it is not a valid one a FormatException will be thrown). A downside to using a space in this manner is that one will be expected in the string to parse or will be output when converting to a string.

The alternative is to prepend “%” – this avoids the issue with spaces and serves as a special escape to allow for single character custom format specifiers.


Take a look at the documentation for more detail.

I will not give examples for these, as the documentation contains plenty.

If you have specific questions about the contents of this post, please post them in the comments and I will answer to the best of my ability.

Share:

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.