Синтаксический анализ строк даты и времени в .NETParsing Date and Time Strings in .NET

Чтобы анализировать строки для преобразования их в объекты DateTime, нужно указать, как значения даты и времени представлены в текстовом формате.Parsing strings to convert them to DateTime objects requires you to specify information about how the dates and times are represented as text. Для различных языков и региональных параметров значения дня, месяца и года приводятся в разном порядке.Different cultures use different orders for day, month, and year. В одних представлениях времени используется 24-часовой формат, в других же указываются значения AM и PM.Some time representations use a 24-hour clock, others specify "AM" and "PM." В одних приложениях требуется только дата.Some applications need only the date. В других — только время.Others need only the time. А в некоторых нужно указывать и дату, и время.Still others need to specify both the date and the time. Методы преобразования строк в объекты DateTime позволяют предоставлять подробные сведения о требуемых форматах и элементах дат и времени, которые необходимы для вашего приложения.The methods that convert strings to DateTime objects enable you to provide detailed information about the formats you expect and the elements of a date and time your application needs. Есть три подзадачи для правильного преобразования текста в DateTime:There are three subtasks to correctly converting text into a DateTime:

  1. Укажите требуемый формат текста, представляющего дату и время.You must specify the expected format of the text representing a date and time.
  2. Можно указать язык и региональные параметры для формата даты и времени.You may specify the culture for the format of a date time.
  3. Можно указать, как отсутствующие в тексте компоненты задаются в значениях даты и времени.You may specify how missing components in the text representation are set in the date and time.

Методы Parse и TryParse позволяют преобразовать много стандартных представлений даты и времени.The Parse and TryParse methods convert many common representations of a date and time. Методы ParseExactи TryParseExact позволяют преобразовать строковое представление, соответствующее шаблону, указанному в строке формата даты и времени.The ParseExact and TryParseExact methods convert a string representation that conforms to the pattern specified by a date and time format string. (Дополнительные сведения см. в статьях Строки стандартных форматов даты и времени и Строки настраиваемых форматов даты и времени.)(See the articles on standard date and time format strings and custom date and time format strings for details.)

Текущий объект DateTimeFormatInfo обеспечивает более точный контроль над тем, как текст должен интерпретироваться в качестве даты и времени.The current DateTimeFormatInfo object provides more control over how text should be interpreted as a date and time. В свойствах DateTimeFormatInfo описываются разделители даты и времени, названия месяцев, дней и эр, а также формат для обозначения AM и PM.Properties of a DateTimeFormatInfo describe the date and time separators, and the names of months, days, and eras, and the format for the "AM" and "PM" designations. Объект DateTimeFormatInfo в текущем потоке представляет текущие язык и региональные параметры.The current thread culture provides a DateTimeFormatInfo that represents the current culture. Если требуется задать определенные язык и региональные параметры или настраиваемые параметры, укажите для метода анализа параметр IFormatProvider.If you want a specific culture or custom settings, you specify the IFormatProvider parameter of a parsing method. Для параметра IFormatProvider следует указать объект CultureInfo, представляющий язык и региональные параметры, или объект DateTimeFormatInfo.For the IFormatProvider parameter, specify a CultureInfo object, which represents a culture, or a DateTimeFormatInfo object.

В тексте, представляющем дату и время, могут отсутствовать некоторые сведения.The text representing a date or time may be missing some information. Например, большинство пользователей будет считать, что дата "12 марта" относится к текущему году.For example, most people would assume the date "March 12" represents the current year. Аналогичным образом, "март 2018 г." представляет месяц март 2018 года.Similarly, "March 2018" represents the month of March in the year 2018. Текст, представляющий время, часто включает только часы, минуты и обозначение AM или PM.Text representing time often does only includes hours, minutes, and an AM/PM designation. При помощи методов анализа эти отсутствующие данные обрабатываются с использованием обоснованных значений по умолчанию:Parsing methods handle this missing information by using reasonable defaults:

  • если указано только время, в части даты используется текущая дата;When only the time is present, the date portion uses the current date.
  • если указана только дата, в части времени задается полночь;When only the date is present, the time portion is midnight.
  • если в дате не указан год, используется текущий год;When the year isn't specified in a date, the current year is used.
  • если не указано число месяца, задается первое число месяца.When the day of the month isn't specified, the first of the month is used.

Если в строке есть дата, она должна включать месяц и день или год.If the date is present in the string, it must include the month and one of the day or year. Если указано время, значение должно содержать час и минуты или обозначение AM либо PM.If the time is present, it must include the hour, and either the minutes or the AM/PM designator.

Чтобы переопределить эти значения по умолчанию, можно задать константу NoCurrentDateDefault.You can specify the NoCurrentDateDefault constant to override these defaults. Если вы используете эту константу, для всех отсутствующих параметров года, месяца или дня устанавливается значение 1.When you use that constant, any missing year, month, or day properties are set to the value 1. Это демонстрирует последний пример, в котором применяется Parse.The last example using Parse demonstrates this behavior.

Помимо компонента даты и времени строковое представление даты и времени может содержать смещение, которое указывает, насколько время отличается от универсального синхронизированного времени (UTC).In addition to a date and a time component, the string representation of a date and time can include an offset that indicates how much the time differs from Coordinated Universal Time (UTC). Например, строка "14/02/2007 5:32:00 -7: 00" определяет время, которое на семь часов меньше, чем UTC.For example, the string "2/14/2007 5:32:00 -7:00" defines a time that is seven hours earlier than UTC. Если в строковом представлении времени не задано смещение, то синтаксический анализ возвращает объект DateTime, свойство Kind которого имеет значение DateTimeKind.Unspecified.If an offset is omitted from the string representation of a time, parsing returns a DateTime object with its Kind property set to DateTimeKind.Unspecified. Если смещение задано, то синтаксический анализ возвращает объект DateTime, свойство Kind которого имеет значение DateTimeKind.Local и значение которого установлено с учетом местного часового пояса компьютера.If an offset is specified, parsing returns a DateTime object with its Kind property set to DateTimeKind.Local and its value adjusted to the local time zone of your machine. Это поведение можно изменить, указав для метода анализа значение DateTimeStyles.You can modify this behavior by using a DateTimeStyles value with the parsing method.

Поставщик формата также используется для интерпретации неоднозначных числовых дат.The format provider is also used to interpret an ambiguous numeric date. Например, в строке "02/03/04" неясно, какие компоненты соответствуют месяцу, дню и году.It is not clear which components of the date represented by the string "02/03/04" are the month, day, and year. Такие компоненты интерпретируются согласно их порядку расположения в схожих форматах даты в поставщике формата.The components are interpreted according to the order of similar date formats in the format provider.

ParseParse

Ниже приведен пример использования метода DateTime.Parse для преобразования string в DateTime.The following example illustrates the use of the DateTime.Parse method to convert a string into a DateTime. В этом примере используются язык и региональные параметры, связанные с текущим потоком.This example uses the culture associated with the current thread. Если класс CultureInfo, связанный с текущим значением языка и региональных параметров, не может выполнить синтаксический анализ исходной строки, создается исключение FormatException.If the CultureInfo associated with the current culture cannot parse the input string, a FormatException is thrown.

Совет

Все примеры C# в этой статье выполняются в браузере.All the C# samples in this article run in your browser. Нажмите кнопку Выполнить, чтобы просмотреть выходные данные.Press the Run button to see the output. Вы можете поэкспериментировать, изменяя их значения.You can also edit them to experiment yourself.

Примечание

Эти примеры для C# и Visual Basic вы можете найти в репозитории документации GitHub.These examples are available in the GitHub docs repo for both C# and VB. Вы также можете загрузить проект в виде ZIP-файла для C# или Visual Basic.Or you can download the project as a zipfile for C# or VB.

string dateInput = "Jan 1, 2009";
DateTime parsedDate = DateTime.Parse(dateInput);
Console.WriteLine(parsedDate);
// Displays the following output on a system whose culture is en-US:
//       1/1/2009 12:00:00 AM
Dim MyString As String = "Jan 1, 2009"
Dim MyDateTime As DateTime = DateTime.Parse(MyString)
Console.WriteLine(MyDateTime)
' Displays the following output on a system whose culture is en-US:
'       1/1/2009 12:00:00 AM

Кроме того, вы можете явно определить язык и региональные параметры, соглашения о форматировании для которых используются при анализе строки.You can also explicitly define the culture whose formatting conventions are used when you parse a string. Укажите один из стандартных объектов DateTimeFormatInfo, возвращенных свойством CultureInfo.DateTimeFormat.You specify one of the standard DateTimeFormatInfo objects returned by the CultureInfo.DateTimeFormat property. В приведенном ниже примере поставщик формата используется для анализа строки на немецком языке в DateTime.The following example uses a format provider to parse a German string into a DateTime. Для представления языка и региональных параметров de-DE создается CultureInfo.It creates a CultureInfo representing the de-DE culture. Этот объект CultureInfo обеспечивает успешный анализ определенной строки.That CultureInfo object ensures successful parsing of this particular string. Это устраняет необходимость задания каких-либо параметров в CurrentCulture потока CurrentThread.This precludes whatever setting is in the CurrentCulture of the CurrentThread.

CultureInfo MyCultureInfo = new CultureInfo("de-DE");
string MyString = "12 Juni 2008";
DateTime MyDateTime = DateTime.Parse(MyString, MyCultureInfo);
Console.WriteLine(MyDateTime);
// The example displays the following output:
//       6/12/2008 12:00:00 AM
Dim MyCultureInfo As New CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo)
Console.WriteLine(MyDateTime)
' The example displays the following output:
'       6/12/2008 12:00:00 AM

Для указания поставщиков пользовательских форматов можно использовать перегрузки метода Parse. Но такой метод не поддерживает анализ нестандартных форматов.However, although you can use overloads of the Parse method to specify custom format providers, the method does not support parsing non-standard formats. Вместо этого используйте метод ParseExact для анализа даты и времени, выраженных в нестандартном формате.To parse a date and time expressed in a non-standard format, use the ParseExact method instead.

В приведенном ниже примере перечисление DateTimeStyles указывает, что текущие значения даты и времени не нужно добавлять в DateTime для неуказанных полей.The following example uses the DateTimeStyles enumeration to specify that the current date and time information should not be added to the DateTime for unspecified fields.

CultureInfo MyCultureInfo = new CultureInfo("de-DE");
string MyString = "12 Juni 2008";
DateTime MyDateTime = DateTime.Parse(MyString, MyCultureInfo,
                                     DateTimeStyles.NoCurrentDateDefault);
Console.WriteLine(MyDateTime);
// The example displays the following output if the current culture is en-US:
//      6/12/2008 12:00:00 AM
Dim MyCultureInfo As New CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo,
                           DateTimeStyles.NoCurrentDateDefault)
Console.WriteLine(MyDateTime)
' The example displays the following output if the current culture is en-US:
'       6/12/2008 12:00:00 AM

ParseExactParseExact

Метод DateTime.ParseExact позволяет преобразовать строку в объект DateTime, если она соответствует одному из указанных шаблонов строк.The DateTime.ParseExact method converts a string to a DateTime object if it conforms to one of the specified string patterns. Если в этот метод передается строка, не соответствующая ни одному из указанных шаблонов, создается исключение FormatException.When a string that is not one of the forms specified is passed to this method, a FormatException is thrown. Можно задать один из стандартных описателей формата даты и времени или сочетание пользовательских описателей формата.You can specify one of the standard date and time format specifiers or a combination of the custom format specifiers. При использовании пользовательских описателей формата можно сконструировать пользовательскую строку распознавания.Using the custom format specifiers, it is possible for you to construct a custom recognition string. Сведения об описателях см. в разделах Строки стандартных форматов даты и времени и Строки настраиваемых форматов даты и времени.For an explanation of the specifiers, see the topics on standard date and time format strings and custom date and time format strings.

В приведенном ниже примере в метод DateTime.ParseExact передается переназначенный для анализа строковый объект. Затем следует описатель формата, который сопровождается объектом CultureInfo.In the following example, the DateTime.ParseExact method is passed a string object to parse, followed by a format specifier, followed by a CultureInfo object. С помощью этого метода ParseExact можно анализировать только строки, соответствующие шаблону полной даты для языка и региональных параметров en-US.This ParseExact method can only parse strings that follow the long date pattern in the en-US culture.

CultureInfo MyCultureInfo = new CultureInfo("en-US");
string[] MyString = { " Friday, April 10, 2009", "Friday, April 10, 2009" };
foreach (string dateString in MyString)
{
    try
    {
        DateTime MyDateTime = DateTime.ParseExact(dateString, "D", MyCultureInfo);
        Console.WriteLine(MyDateTime);
    }
    catch (FormatException)
    {
        Console.WriteLine("Unable to parse '{0}'", dateString);
    }
}
// The example displays the following output:
//       Unable to parse ' Friday, April 10, 2009'
//       4/10/2009 12:00:00 AM
Dim MyCultureInfo As New CultureInfo("en-US")
Dim MyString() As String = {" Friday, April 10, 2009", "Friday, April 10, 2009"}
For Each dateString As String In MyString
    Try
        Dim MyDateTime As DateTime = DateTime.ParseExact(dateString, "D",
                                                     MyCultureInfo)
        Console.WriteLine(MyDateTime)
    Catch e As FormatException
        Console.WriteLine("Unable to parse '{0}'", dateString)
    End Try
Next
' The example displays the following output:
'       Unable to parse ' Friday, April 10, 2009'
'       4/10/2009 12:00:00 AM

При каждой перегрузке методов Parse и ParseExact также используется параметр IFormatProvider, который предоставляет сведения о языке и региональных параметрах для форматирования строки.Each overload of the Parse and ParseExact methods also has an IFormatProvider parameter that provides culture-specific information about the formatting of the string. Этот объект IFormatProvider является объектом CultureInfo, который представляет стандартные язык и региональные параметры, или объектом DateTimeFormatInfo, возвращаемым в свойстве CultureInfo.DateTimeFormat.This IFormatProvider object is a CultureInfo object that represents a standard culture or a DateTimeFormatInfo object that is returned by the CultureInfo.DateTimeFormat property. Кроме того, в методе ParseExact используется дополнительная строка или аргумент массива строк для определения одного или нескольких настраиваемых форматов даты и времени.ParseExact also uses an additional string or string array argument that defines one or more custom date and time formats.

См. такжеSee also