Как преобразовать строку в datetime c
Перейти к содержимому

Как преобразовать строку в datetime c

  • автор:

Parse date and time strings in .NET

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. 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 time. 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. 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 can specify the culture for the format of a date time.
  3. You can specify how missing components in the text representation are set in the date and time.

The Parse and TryParse methods convert many common representations of a date and time. The ParseExact and TryParseExact methods convert a string representation that conforms to the pattern specified by a date and time format string. For more information, see the articles on standard date and time format strings and custom date and time format strings.

The current DateTimeFormatInfo object provides more control over how text should be interpreted as a date and time. Properties of a DateTimeFormatInfo describe the date and time separators, the names of months, days, and eras, and the format for the «AM» and «PM» designations. The CultureInfo returned by CultureInfo.CurrentCulture has a CultureInfo.DateTimeFormat property that represents the current culture. If you want a specific culture or custom settings, you specify the IFormatProvider parameter of a parsing method. For the IFormatProvider parameter, specify a CultureInfo object, which represents a culture, or a DateTimeFormatInfo object.

The text representing a date or time might be missing some information. For example, most people would assume the date «March 12» represents the current year. Similarly, «March 2018» represents the month of March in the year 2018. Text representing time often does only include 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 day 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. If the time is present, it must include the hour, and either the minutes or the AM/PM designator.

You can specify the NoCurrentDateDefault constant to override these defaults. When you use that constant, any missing year, month, or day properties are set to the value 1 . The last example using Parse demonstrates this behavior.

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). For example, the string «2/14/2007 5:32:00 -7:00» defines a time that is seven hours earlier than UTC. 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. If an offset is specified, parsing returns a DateTime object with its Kind property set to DateTimeKind.Local. Its value is also adjusted to the local time zone of your machine. 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. It’s unclear 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.

Parse

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. If the CultureInfo associated with the current culture can’t parse the input string, a FormatException is thrown.

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.

These examples are available in the GitHub docs repo for both C# and 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 

You can also explicitly define the culture whose formatting conventions are used when you parse a string. You specify one of the standard DateTimeFormatInfo objects returned by the CultureInfo.DateTimeFormat property. The following example uses a format provider to parse a German string into a DateTime. It creates a CultureInfo representing the de-DE culture. That CultureInfo object ensures successful parsing of this particular string. This process precludes whatever setting is in the CurrentCulture of the 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 

However, you can use overloads of the Parse method to specify custom format providers. The Parse method doesn’t support parsing non-standard formats. To parse a date and time expressed in a non-standard format, use the ParseExact method instead.

The following example uses the DateTimeStyles enumeration to specify that the current date and time information shouldn’t be added to the DateTime for unspecified fields.

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

The DateTime.ParseExact method converts a string to a DateTime object if it conforms to one of the specified string patterns. When a string that isn’t 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’s possible for you to construct a custom recognition string. For an explanation of the specifiers, see the articles on standard date and time format strings and custom date and time format strings.

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. This ParseExact method can only parse strings that follow the long date pattern in the en-US culture.

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 = 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 ''", dateString) End Try Next ' The example displays the following output: ' Unable to parse ' Friday, April 10, 2009' ' 4/10/2009 00:00:00 

Each overload of the Parse and ParseExact methods also has an IFormatProvider parameter that provides culture-specific information about the formatting of the string. The IFormatProvider object is a CultureInfo object that represents a standard culture or a DateTimeFormatInfo object that is returned by the CultureInfo.DateTimeFormat property. ParseExact also uses an additional string or string array argument that defines one or more custom date and time formats.

See also

  • Parsing strings
  • Formatting types
  • Type conversion in .NET
  • Standard date and time formats
  • Custom date and time format strings

Collaborate with us on GitHub

The source for this content can be found on GitHub, where you can also create and review issues and pull requests. For more information, see our contributor guide.

Синтаксический анализ строк даты и времени в .NET

Чтобы анализировать строки для преобразования их в объекты DateTime, нужно указать, как значения даты и времени представлены в текстовом формате. Для различных языков и региональных параметров значения дня, месяца и года приводятся в разном порядке. В некоторых представлениях времени используются 24-часовые часы, в других — «AM» и «PM». Некоторым приложениям требуется только дата. В других — только время. Остальные должны указывать как дату, так и время. Методы преобразования строк в объекты DateTime позволяют предоставлять подробные сведения о требуемых форматах и элементах дат и времени, которые необходимы для вашего приложения. Есть три подзадачи для правильного преобразования текста в DateTime:

  1. Укажите требуемый формат текста, представляющего дату и время.
  2. Вы можете указать язык и региональные параметры для формата даты и времени.
  3. Вы можете указать, как отсутствующие компоненты в текстовом представлении задаются в дату и время.

Методы 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» определяет время, которое на семь часов меньше, чем UTC. Если в строковом представлении времени не задано смещение, то синтаксический анализ возвращает объект DateTime, свойство Kind которого имеет значение DateTimeKind.Unspecified. Если указано смещение, при синтаксическом анализе возвращается объект со свойством DateTimeKind , равным DateTimeKind.Local. Его значение также корректируется в соответствии с местным часовой поясом компьютера. Это поведение можно изменить, указав для метода анализа значение DateTimeStyles.

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

Parse

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

Все примеры C# в этой статье выполняются в браузере. Нажмите кнопку Выполнить, чтобы просмотреть выходные данные. Вы можете поэкспериментировать, изменяя их значения.

Эти примеры для C# и Visual Basic см. в репозитории с документацией GitHub.

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. Для представления языка и региональных параметров de-DE создается CultureInfo. Этот объект CultureInfo обеспечивает успешный анализ определенной строки. Этот процесс исключает любой параметр в .CurrentCultureCurrentThread

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 = 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 ''", 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 используется дополнительная строка или аргумент массива строк для определения одного или нескольких настраиваемых форматов даты и времени.

См. также

  • Анализ строк
  • Типы форматирования
  • Преобразование типов в .NET
  • Стандартные форматы даты и времени
  • Строки настраиваемых форматов даты и времени

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Не удалось неявно преобразовать string в DateTime?

5fd0ec389acdc714335811.png

Кароче, есть текст бокс и база данных, в которую должно записываться значение из текст бокса, но у меня тут проблемы преобразования даты в строку. Скрин

  • Вопрос задан более трёх лет назад
  • 318 просмотров

1 комментарий

Средний 1 комментарий

Как преобразовать строку в datetime c

При обработке данных из стороннего источника необходимо было изменить формат даты под используемый нами формат. Дата была формата «28 февраля 2014 г.», т.е. это была строка с русским названием месяца. И еще «г.» в конце.

Для преобразование такой строки в дату не подойдет автоматический метод преобразования строки в дату Convert.ToDateTime. В данном случае потребуется использование метода DateTime.ParseExact и класс CultureInfo, который предназначен для работы с региональной культурой – с названиями дней и месяцев календарей, форматами дат, сортировкой по алфавиту и т.д.

Значения региональных параметров для CulterInfoможно посмотреть на странице http://msdn.microsoft.com/en-us/goglobal/bb896001.aspx, а формат даты – в MSDNовском описании Custom Date and Time Format Strings.

Для преобразования строки «28 февраля 2014 г.» в формат DateTime и дальнейшей работой, я написал небольшой фрагмент кода. Код получился немного академическим, но аккуратность – не лишнее качество программиста. Для наглядности и простоты привожу код консольного приложения.

using System; using System.Globalization; using System.Text; namespace ConvertRusStringDateToDateTime < class Program < static void Main(string[] args) < string rusdate, format, spresult; DateTime result; rusdate = "28 февраля 2014 г."; format = "dd MMMM yyyy г."; CultureInfo provider = CultureInfo.CreateSpecificCulture("ru-RU"); try < result = DateTime.ParseExact(rusdate, format, provider); spresult = result.ToString("dd-MM-yyyy"); Console.WriteLine(spresult); >catch (Exception ex) < Console.WriteLine(ex.Message); >Console.WriteLine("Press any key to continue"); Console.ReadKey(true); > > >

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *