See Also: DateTime Members
The DateTime value type represents dates and times with values ranging from 00:00:00 (midnight), January 1, 0001 Anno Domini (Common Era) through 11:59:59 P.M., December 31, 9999 A.D. (C.E.) in the Gregorian calendar.
Time values are measured in 100-nanosecond units called ticks, and a particular date is the number of ticks since 12:00 midnight, January 1, 0001 A.D. (C.E.) in the System.Globalization.GregorianCalendar calendar (excluding ticks that would be added by leap seconds). For example, a ticks value of 31241376000000000L represents the date, Friday, January 01, 0100 12:00:00 midnight. A DateTime value is always expressed in the context of an explicit or default calendar.
If you are working with a ticks value that you want to convert to some other time interval, such as minutes or seconds, you should use the TimeSpan.TicksPerDay, TimeSpan.TicksPerHour, TimeSpan.TicksPerMinute, TimeSpan.TicksPerSecond, or TimeSpan.TicksPerMillisecond constant to perform the conversion. For example, to add the number of seconds represented by a specified number of ticks to the DateTime.Second component of a DateTime value, you can use the expression dateValue.Second + nTicks/Timespan.TicksPerSecond.
In this section:
Instantiating a DateTime object DateTime values and their string representations Converting strings to DateTime values Version considerations DateTime values DateTime operations DateTime vs. TimeSpan COM interop considerations
You can create a new DateTime value in any of the following ways:
By calling any of the overloads of the DateTime constructor that allow you to specify specific elements of the date and time value (such as the year, month, and day, or the number of ticks). The following statement illustrates a call to one of the DateTime constructors to create a date with a specific year, month, day, hour, minute, and second.
code reference: System.DateTime.Instantiation#1
By using any compiler-specific syntax for declaring date and time values. For example, the following Visual Basic statement initializes a new DateTime value.
code reference: System.DateTime.Instantiation#2
By assigning the DateTime object a date and time value returned by a property or method. The following example assigns the current date and time, the current Coordinated Universal Time (UTC) date and time, and the current date to three new DateTime variables.
code reference: System.DateTime.Instantiation#3
By parsing the string representation of a date and time value. The erload:System.DateTime.Parse, erload:System.DateTime.ParseExact, erload:System.DateTime.TryParse, and erload:System.DateTime.TryParseExact methods all convert a string to its equivalent date and time value. The following example uses the DateTime.Parse(string, IFormatProvider) method to parse a string and convert it to a DateTime value.
code reference: System.DateTime.Instantiation#4
Note that the erload:System.DateTime.TryParse and erload:System.DateTime.TryParseExact methods indicate whether a particular string contains a valid representation of a DateTime value in addition to performing the conversion.
By calling the DateTime structure's implicit default constructor. (For details on the implicit default constructor of a value type, see Value Types (C# Reference).) An approximate equivalent, for compilers that support it, is declaring a DateTime value without explicitly assigning a date and time to it. The following example illustrates a call to the DateTime implicit default constructor in C# and Visual Basic, as well as a DateTime variable declaration with no assignment in Visual Basic.
code reference: System.DateTime.Instantiation#5
Internally, all DateTime values are represented as the number of ticks (the number of 100-nanosecond intervals) that have elapsed since 12:00:00 midnight, January 1, 0001. The actual DateTime value is independent of the way in which that value appears when displayed in a user interface element or when written to a file. The appearance of a DateTime value is the result of a formatting operation. Formatting is the process of converting a value to its string representation.
Because the appearance of date and time values is dependent on such factors as culture, international standards, application requirements, and personal preference, the DateTime structure offers a great deal of flexibility in formatting date and time values through the overloads of its erload:System.DateTime.ToString method. The default DateTime.ToString method returns the string representation of a date and time value using the current culture's short date and long time pattern. The following example uses the default DateTime.ToString method to display the date and time using the short date and long time pattern for the en-US culture, the current culture on the computer on which the example was run.
code reference: System.DateTime.Formatting#1
The DateTime.ToString(IFormatProvider) method returns the string representation of a date and time value using the short date and long time pattern of a specific culture. The following example uses the DateTime.ToString(IFormatProvider) method to display the date and time using the short date and long time pattern for the fr-FR culture.
code reference: System.DateTime.Formatting#2
The DateTime.ToString(string) method returns the string representation of the date and time in a format defined by a standard or custom format specifier and using the formatting conventions of the current culture. The following example uses the DateTime.ToString(string) method to display the full date and time pattern for the en-US culture, the current culture on the computer on which the example was run.
code reference: System.DateTime.Formatting#3
The DateTime.ToString(string, IFormatProvider) method returns the string representation of the date and time in a format defined by a specific format specifier and using the formatting conventions of a specific culture. The following example uses the DateTime.ToString(string, IFormatProvider) method to display the full date and time pattern for the fr-FR culture.
code reference: System.DateTime.Formatting#4
For more information about formatting DateTime values, see Standard Date and Time Format Strings and Custom Date and Time Format Strings.
Parsing involves converting the string representation of a date and time to a DateTime value. Typically, date and time strings have two different usages in applications:
They represent a date and time that can take a variety of forms and that reflect the conventions of either the current culture or a specific culture. For example, an application may allow a user whose current culture is en-US to input a date value as "12/15/2013" or "December 15, 2013", and allow a user whose current culture is en-GB to input a date value as "15/12/2013" or "15 December 2013".
They represent a date and time in a predefined format. For example, an application may serialize a date as "20130103" independently of the culture on which the app is running, or it may require that a date be input in the current culture's short date format.
You can use the DateTime.Parse(string) or DateTime.TryParse(string, DateTime@) method to convert a string that might reflect one of the common date and time formats used by a culture to a DateTime value. The following example shows how you can use DateTime.TryParse(string, DateTime@) to convert date strings in a number of different culture-specific formats to a DateTime value. It changes the current culture to English (Great Britain) and calls the DateTime.GetDateTimeFormats method to generate an array of date and time strings. It then passes each element in the array to the DateTime.TryParse(string, DateTime@) method. The output from the example shows that the parsing method was able to successfully convert each of the culture-specific date and time strings.
code reference: System.DateTime.Parsing#1
You can use the DateTime.TryParse(string, DateTime@) and DateTime.TryParseExact(string, string, IFormatProvider, System.Globalization.DateTimeStyles, DateTime@) methods to convert a date and time string that must match a particular format or formats to a DateTime value. You specify the required format or formats as a parameter to the parsing method by using one or more standard or custom date and time format strings. The following example uses the DateTime.TryParseExact(string, String[], IFormatProvider, System.Globalization.DateTimeStyles, DateTime@) method to convert strings that must be either in a "yyyyMMdd" format or a "HHmmss" format to DateTime values.
code reference: System.DateTime.Parsing#2
The DateTime.Parse(string) and DateTime.ParseExact(string, string, IFormatProvider) methods throw an exception if the string to be converted to a DateTime value cannot be parsed. The DateTime.TryParse(string, DateTime@) and DateTime.TryParseExact(string, string, IFormatProvider, System.Globalization.DateTimeStyles, DateTime@) methods return a Boolean value that indicates whether the conversion succeeded or failed. Because the parsing operation for date and time strings, particularly if strings are input by users, tends to have a high failure rate, and because exception handling is expensive, you should use the DateTime.TryParse(string, DateTime@) or DateTime.TryParseExact(string, string, IFormatProvider, System.Globalization.DateTimeStyles, DateTime@) methods in scenarios where performance is important or conversions are subject to a high rate of failure.
For more information about parsing date and time values, see Parsing Date and Time Strings.
Prior to the .NET Framework version 2.0, the DateTime structure contains a 64-bit field composed of an unused 2-bit field concatenated with a private Ticks field, which is a 62-bit unsigned field that contains the number of ticks that represent the date and time. The value of the Ticks field can be obtained with the DateTime.Ticks property.
Starting with the .NET Framework 2.0, the DateTime structure contains a 64-bit field composed of a private Kind field concatenated with the Ticks field. The Kind field is a 2-bit field that indicates whether the DateTime structure represents a local time, a Coordinated Universal Time (UTC), or the time in an unspecified time zone. The Kind field is used when performing time conversions between time zones, but not for time comparisons or arithmetic. The value of the Kind field can be obtained with the DateTime.Kind property.
An alternative to the DateTime structure for working with date and time values in particular time zones is the DateTimeOffset structure. The DateTimeOffset structure stores date and time information in a private DateTime field and the number of minutes by which that date and time differs from UTC in a private short field. This makes it possible for a DateTimeOffset value to reflect the time in a particular time zone, whereas a DateTime value can unambiguously reflect only UTC and the local time zone's time. For a discussion about when to use the DateTime structure or the DateTimeOffset structure when working with date and time values, see Choosing Between DateTime, DateTimeOffset, and TimeZoneInfo.
Descriptions of time values in the DateTime type are often expressed using the Coordinated Universal Time (UTC) standard, which is the internationally recognized name for Greenwich Mean Time (GMT). Coordinated Universal Time is the time as measured at zero degrees longitude, the UTC origin point. Daylight saving time is not applicable to UTC.
Local time is relative to a particular time zone. A time zone is associated with a time zone offset, which is the displacement of the time zone measured in hours from the UTC origin point. In addition, local time is optionally affected by daylight saving time, which adds or subtracts an hour from the length of a day. Consequently, local time is calculated by adding the time zone offset to UTC and adjusting for daylight saving time if necessary. The time zone offset at the UTC origin point is zero.
UTC time is suitable for calculations, comparisons, and storing dates and time in files. Local time is appropriate for display in user interfaces of desktop applications. Time zone-aware applications (such as many Web applications) also need to work with a number of other time zones.
If the DateTime.Kind property of a DateTime object is DateTimeKind.Unspecified, it is unspecified whether the time represented is local time, UTC time, or a time in some other time zone.
A calculation using a DateTime structure, such as DateTime.Add(TimeSpan) or DateTime.Subtract(DateTime), does not modify the value of the structure. Instead, the calculation returns a new DateTime structure whose value is the result of the calculation.
Conversion operations between time zones (such as between UTC and local time, or between one time zone and another) take daylight saving time into account, but arithmetic and comparison operations do not.
The DateTime structure itself offers limited support for converting from one time zone to another. You can use the DateTime.ToLocalTime method to convert UTC to local time, or you can use the DateTime.ToUniversalTime method to convert from local time to UTC. However, a full set of time zone conversion methods is available in the TimeZoneInfo class. Using these methods, you can convert the time in any one of the world's time zones to the time in any other time zone.
Calculations and comparisons of DateTime objects are meaningful only if the objects represent times in the same time zone. You can use a TimeZoneInfo object to represent a DateTime value's time zone, although the two are loosely coupled. (That is, a DateTime object does not have a property that returns an object that represents that date and time value's time zone other than the DateTime.Kind property.) For this reason, in a time zone-aware application, you must rely on some external mechanism to determine the time zone in which a DateTime object was created. For example, you could use a structure that wraps both the DateTime value and the TimeZoneInfo object that represents the DateTime value's time zone. For details on using UTC in calculations and comparisons with DateTime values, see Performing Arithmetic Operations with Dates and Times.
Each DateTime member implicitly uses the Gregorian calendar to perform its operation, with the exception of constructors that specify a calendar, and methods with a parameter derived from IFormatProvider, such as System.Globalization.DateTimeFormatInfo, that implicitly specifies a calendar.
Operations by members of the DateTime type take into account details such as leap years and the number of days in a month.
Two other common operations with DateTime values involve converting a date and time value to or from its string representation. The process of converting a DateTime value to its string representation is a formatting operation; for more information about formatting, see DateTime values and their string representations. The process of converting the string representation of a date and time to a DateTime value is a parsing operation; for more information about parsing, see Converting strings to DateTime values.
The DateTime and TimeSpan value types differ in that a DateTime represents an instant in time whereas a TimeSpan represents a time interval. This means, for example, that you can subtract one instance of DateTime from another to obtain a TimeSpan object that represents the time interval between them. Or you could add a positive TimeSpan to the current DateTime to obtain a DateTime value that represents a future date.
You can add or subtract a time interval from a DateTime object. Time intervals can be negative or positive, can be expressed in units such as ticks or seconds, or can be expressed as a TimeSpan object.
A DateTime value that is transferred to a COM application, then is transferred back to a managed application, is said to round-trip. However, a DateTime value that specifies only a time does not round-trip as you might expect.
If you round-trip only a time, such as 3 P.M., the final date and time is December 30, 1899 C.E. at 3:00 P.M., instead of January, 1, 0001 C.E. at 3:00 P.M. This happens because the .NET Framework and COM assume a default date when only a time is specified. However, the COM system assumes a base date of December 30, 1899 C.E. while the .NET Framework assumes a base date of January, 1, 0001 C.E.
When only a time is passed from the .NET Framework to COM, special processing is performed that converts the time to the format used by COM. When only a time is passed from COM to the .NET Framework, no special processing is performed because that would corrupt legitimate dates and times on or before December 30, 1899. This also means if a date starts its round-trip from COM, the .NET Framework and COM preserve the date.
The behavior of the .NET Framework and COM means that if your application round-trips a DateTime that only specifies a time, your application must remember to modify or ignore the erroneous date from the final DateTime object.