Поделиться через


Разбор строк даты и времени

Обновлен: Ноябрь 2007

Методы синтаксического анализа преобразовывают строковое представление даты и времени в эквивалентный объект DateTime. Методы Parse и TryParse преобразовывают любое из нескольких общих представлений даты и времени. Методы ParseExact и TryParseExact преобразуют строковое представление, которое соответствует шаблону, заданному в строке формата даты и времени.

На синтаксический анализ влияют свойства поставщика формата, который предоставляет такие сведения как строки, используемые для разделителей даты и времени, обозначения месяцев, дней и периодов. Поставщик формата является текущим объектом DateTimeFormatInfo, неявно предоставляемый языком и региональными параметрами текущего потока или явно заданный параметром IFormatProvider метода разбора. Для параметра IFormatProvider укажите объект CultureInfo, представляющий язык и региональные параметры, или объект DateTimeFormatInfo.

Для выполнения синтаксического анализа строковое представление даты должно содержать месяц и, по крайней мере, день или год. Строковое представление времени должно содержать часы и, по крайней мере, минуты или обозначение AM/PM. Однако при разборе опущенных компонентов для них указываются значения по умолчанию, если это возможно. Опущенная дата по умолчанию становится текущей датой, опущенный год по умолчанию становится текущим годом, опущенный день месяца по умолчанию становится первым днем месяца, а опущенное время по умолчанию задается как полночь.

Если строковое представление указывает только время, то при разборе возвращается объект DateTime с его свойствами Year, Month, Day, которым присвоены соответствующие значения свойства Today. Тем не менее, если константа NoCurrentDateDefault указана в методе разбора, то свойствам год, месяц и день присваиваются значения 1.

Помимо компонента даты и времени строковое представление даты и времени может содержать смещение, которое указывает на сколько время отличается от универсального синхронизированного времени (UTC). Например, строка "14/02/2007 5:32:00 -7: 00" определяет время, которое на семь часов меньше чем UTC. Если смещение не задано в строковом представлении времени, то при разборе возвращается объект DateTime со значением свойства Kind заданным как DateTimeKind.Unspecified. Если смещение задано, то при разборе возвращается объект DateTime со значением свойства Kind, заданным как Local, а его значение настраивается на местный часовой пояс компьютера. Такое поведение можно изменить, используя константу DateTimeStyles вместе с методом разбора.

Поставщик формата также используется для интерпретации неоднозначных числовых дат. Например, не ясно какие компоненты даты в строке "02/03/04" соответствуют месяцу, дню и году. В этом случае компоненты интерпретируются согласно их порядку расположения в схожих форматах даты в поставщике формата.

Разбор

В следующем примере кода показано использование метода Parse для преобразования строки в DateTime. В этом примере для разбора используется язык и региональные параметры, связанные с текущим потоком. Если CultureInfo, связанному с текущими языком и региональными параметрами, не удается выполнить синтаксический анализ входной строки, то создается исключение FormatException.

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
string MyString = "Jan 1, 2009";
DateTime MyDateTime = 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

Также можно задать CultureInfo один из языков и региональных параметров, определяемых этим объектом, или можно указать один из стандартных объектов DateTimeFormatInfo, возвращаемый свойством CultureInfo.DateTimeFormat. В следующем примере кода поставщик формата используется для разбора строки на немецком языке в DateTime. Для обеспечения успешного разбора строки, CultureInfo, представляющий немецкий язык и региональные параметры (de-DE), определен и передан вместе с разбираемой строкой. Это устраняет необходимость задания каких-либо параметров в CurrentCulture потока CurrentThread.

Imports System.Globalization

Module Example
   Public Sub Main()
      Dim MyCultureInfo As CultureInfo = new CultureInfo("de-DE")
      Dim MyString As String = "12 Juni 2008"
      Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo)
      Console.WriteLine(MyDateTime)
   End Sub
End Module
' The example displays the following output:
'       6/12/2008 12:00:00 AM
using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      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

Хотя можно использовать перегрузки метода Parse для задания поставщиков пользовательских форматов, такой метод не поддерживает использование поставщиков нестандартных форматов. Для разбора даты и времени, выраженного в нестандартном формате, используйте метод ParseExact.

В следующем примере кода используется перечисление DateTimeStyles для того, чтобы указать, что в DateTime не требуется возвращать текущие дату и время для полей, не определенных в строке.

Imports System.Globalization

Module Example
   Public Sub Main()
      Dim MyCultureInfo As CultureInfo = new CultureInfo("de-DE")
      Dim MyString As String = "12 Juni 2008"
      Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo, _
                                   DateTimeStyles.NoCurrentDateDefault)
      Console.WriteLine(MyDateTime)
   End Sub
End Module
' The example displays the following output if the current culture is en-US:
'       6/12/2008 12:00:00 AM
using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      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

Метод ParseExact

Метод DateTime.ParseExact преобразует строку, которая соответствует указанному шаблону, в объект DateTime. Когда этому методу передается строка, не соответствующая указанному шаблону, то создается исключение FormatException. Можно задать один из стандартных спецификаторов формата даты и времени или ограниченное сочетание пользовательских спецификаторов формата для даты и времени. При использовании пользовательских спецификаторов формата можно сконструировать пользовательскую строку распознавания. Пояснения спецификаторов содержатся в разделе строки формата даты и времени.

Каждая перегрузка метода ParseExact также имеет параметр IFormatProvider, который, как правило, при форматировании строк предоставляет сведения о языке и региональных параметрах. Как правило, этот объект IFormatProvider является объектом CultureInfo, который представляет стандартные язык и региональные параметры, или объект DateTimeFormatInfo, возвращаемый свойством CultureInfo.DateTimeFormat. Однако в отличие от других функций разбора даты и времени, этот метод также поддерживает IFormatProvider, который определяет нестандартный формат даты и времени.

В следующем примере кода методу ParseExact передается предназначенный для разбора строковый объект, затем передается спецификатор формата, стоящий перед объектом CultureInfo. Этот метод ParseExact может выполнять разбор строк только с шаблоном длинной даты на американском английском (en-US) языке.

Imports System.Globalization

Module Example
   Public Sub Main()
      Dim MyCultureInfo As CultureInfo = 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
   End Sub
End Module
' The example displays the following output:
'       Unable to parse ' Friday, April 10, 2009'
'       4/10/2009 12:00:00 AM
using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      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

См. также

Другие ресурсы

Разбор строк

Типы форматирования

Преобразование типов