Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Для преобразования строк в объекты DateTime требуется указать сведения о том, как даты и время представлены в виде текста. Разные культуры используют разные порядки для дня, месяца и года. В некоторых представлениях используются 24-часовые часы, а другие — "AM" и "PM". Для некоторых приложений требуется только дата. Другие нуждаются только в времени. Тем не менее, другим необходимо указать дату и время. Методы, преобразующие строки в объекты DateTime, позволяют предоставлять подробные сведения о ожидаемых форматах и элементах даты и времени, необходимых приложению. Существует три подзадачи для правильного преобразования текста в DateTime:
- Необходимо указать ожидаемый формат текста, представляющий дату и время.
- Можно указать культуру для формата даты и времени.
- Можно указать, как отсутствующие компоненты в текстовом представлении задаются в дате и времени.
Методы Parse и TryParse преобразуют множество распространенных представлений даты и времени. Методы ParseExact и TryParseExact преобразуют строковое представление, соответствующее шаблону, заданному строкой формата даты и времени. Дополнительные сведения см. в статьях о строках стандартного формата даты и времени и, а также о настраиваемых строках формата даты и времени и.
Текущий объект DateTimeFormatInfo обеспечивает более широкий контроль над интерпретацией текста как даты и времени. Свойства DateTimeFormatInfo описывают разделители даты и времени, имена месяцев, дней и эр, а также формат для обозначений AM и PM. CultureInfo, возвращаемая CultureInfo.CurrentCulture, имеет свойство CultureInfo.DateTimeFormat, которое представляет текущую культуру. Если требуется указать определенную культуру или настройки, задайте параметр IFormatProvider метода синтаксического разбора. Для параметра IFormatProvider укажите объект CultureInfo, представляющий культуру, или объект DateTimeFormatInfo.
Текст, представляющий дату или время, может пропустить некоторые сведения. Например, большинство людей предполагают, что дата "12 марта" относится к текущему году. Аналогичным образом, "Март 2018" представляет месяц марта 2018 года. Текст, представляющий время, часто включает только часы, минуты и обозначение AM/PM. Методы синтаксического анализа обрабатывают эту недостающую информацию с помощью разумных значений по умолчанию:
- Когда присутствует только время, часть даты указывается текущей датой.
- Если указана только дата, время по умолчанию полночь.
- Если год не указан в дате, используется текущий год.
- Если день месяца не указан, используется первый день месяца.
Если дата присутствует в строке, она должна включать месяц и один из дней или года. Если время присутствует, оно должно включать час, а также минуты или указатель AM/PM.
Можно указать константу NoCurrentDateDefault для переопределения этих значений по умолчанию. При использовании этой константы все отсутствующие свойства года, месяца или дня задаются значением 1
. Последний пример с использованием Parse демонстрирует это поведение.
Помимо даты и компонента времени строковое представление даты и времени может включать смещение, указывающее, сколько времени отличается от согласованного универсального времени (UTC). Например, строка "14.02.2007 5:32:00 -7:00" определяет время, которое на 7 часов раньше UTC. Если смещение опущено из строкового представления времени, синтаксический анализ возвращает объект DateTime со свойством Kind, равным DateTimeKind.Unspecified. Если задано смещение, синтаксический анализ возвращает объект DateTime со свойством Kind, равным DateTimeKind.Local. Его значение также настраивается на локальный часовой пояс компьютера. Это поведение можно изменить с помощью значения DateTimeStyles с методом парсинга.
Поставщик формата также используется для интерпретации неоднозначной числовой даты. Неясно, какие компоненты даты представлены строкой "02/03/04" — это месяц, день и год. Компоненты интерпретируются в соответствии с порядком аналогичных форматов дат в поставщике формата.
Анализировать
В следующем примере показано использование метода DateTime.Parse для преобразования string
в DateTime. В этом примере используется культура, связанная с текущим потоком. Если CultureInfo, связанный с текущим языком и региональными параметрами, не может проанализировать входную строку, выбрасывается FormatException.
Подсказка
Все примеры C# в этой статье выполняются в браузере. Нажмите кнопку "Запуск", чтобы просмотреть результат. Вы также можете изменить их, чтобы экспериментировать самостоятельно.
Примечание.
Эти примеры доступны в репозитории документации GitHub для C# и Visual Basic.
string dateInput = "Jan 1, 2009";
var parsedDate = DateTime.Parse(dateInput);
Console.WriteLine(parsedDate);
// Displays the following output on a system whose culture is en-US:
// 1/1/2009 00:00:00
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 00:00:00
Вы также можете явно определить язык и региональные параметры, соглашения о форматировании которых используются при разборе строки. Вы указываете один из стандартных объектов DateTimeFormatInfo, возвращаемых свойством CultureInfo.DateTimeFormat. В следующем примере используется поставщик формата для анализа немецкой строки в DateTime. Он создает CultureInfo, представляющий культуру de-DE
. Этот объект CultureInfo
гарантирует успешный синтаксический анализ конкретной этой строки. Этот процесс исключает любой параметр в CurrentCulture из CurrentThread.
var cultureInfo = new CultureInfo("de-DE");
string dateString = "12 Juni 2008";
var dateTime = DateTime.Parse(dateString, cultureInfo);
Console.WriteLine(dateTime);
// The example displays the following output:
// 6/12/2008 00:00:00
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 00:00:00
Однако можно использовать перегрузки метода Parse для указания настраиваемых поставщиков форматов. Метод Parse не поддерживает синтаксический анализ форматов, отличных от стандартных. Чтобы проанализировать дату и время, выраженную в нестандартном формате, используйте вместо этого метод ParseExact.
Следующий пример использует перечисление DateTimeStyles, чтобы указать, что текущие сведения о дате и времени не должны быть добавлены в DateTime для неопределенных полей.
var cultureInfo = new CultureInfo("de-DE");
string dateString = "12 Juni 2008";
var dateTime = DateTime.Parse(dateString, cultureInfo,
DateTimeStyles.NoCurrentDateDefault);
Console.WriteLine(dateTime);
// The example displays the following output if the current culture is en-US:
// 6/12/2008 00:00:00
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 00:00:00
ParseExact
Метод DateTime.ParseExact преобразует строку в объект DateTime, если он соответствует одному из указанных шаблонов строк. Если строка, которая не является одной из указанных форм, передается этому методу, возникает FormatException. Можно указать один из стандартных описателей формата даты и времени или комбинацию настраиваемых описателей формата. С помощью пользовательских описателей формата можно создать настраиваемую строку распознавания. Описание спецификаций см. в статьях о строках стандартного формата даты и времени и, а также о настраиваемых форматах даты и времени .
В следующем примере метод DateTime.ParseExact передает строковый объект для синтаксического анализа, а затем описатель формата, за которым следует объект CultureInfo. Этот метод ParseExact может анализировать только строки, которые соответствуют шаблону длинной даты в культуре en-US
.
var cultureInfo = new CultureInfo("en-US");
string[] dateStrings = { " Friday, April 10, 2009", "Friday, April 10, 2009" };
foreach (string dateString in dateStrings)
{
try
{
var dateTime = DateTime.ParseExact(dateString, "D", cultureInfo);
Console.WriteLine(dateTime);
}
catch (FormatException)
{
Console.WriteLine($"Unable to parse '{dateString}'");
}
}
// The example displays the following output:
// Unable to parse ' Friday, April 10, 2009'
// 4/10/2009 00:00:00
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 00:00:00
Каждая перегрузка методов Parse и ParseExact также имеет параметр IFormatProvider, предоставляющий сведения о форматировании строки, которые зависят от языковых и культурных особенностей. Объект IFormatProvider — это объект CultureInfo, представляющий стандартную культуру или объект DateTimeFormatInfo, возвращаемый свойством CultureInfo.DateTimeFormat. ParseExact также использует дополнительный аргумент строкового или строкового массива, определяющий один или несколько настраиваемых форматов даты и времени.