Данная статья переведена с помощью средств машинного перевода. Чтобы просмотреть ее на английском языке, установите флажок Английский. Вы также можете просматривать английский текст во всплывающем окне, наводя указатель мыши на переведенный текст.
Перевод
Английский

Структура DateTime

 

Представляет текущее время, обычно выраженное как дата и время суток.

Для просмотра исходного кода .NET Framework для этого типа, в разделе Reference Source.

Пространство имен:   System
Сборка:  mscorlib (в mscorlib.dll)

[SerializableAttribute]
public struct DateTime : IComparable, IFormattable, IConvertible, 
	ISerializable, IComparable<DateTime>, IEquatable<DateTime>

ИмяОписание
System_CAPS_pubmethodDateTime(Int32, Int32, Int32)

Инициализирует новый экземпляр структуры DateTime заданными значениями года, месяца и дня.

System_CAPS_pubmethodDateTime(Int32, Int32, Int32, Calendar)

Инициализирует новый экземпляр структуры DateTime заданным годом, месяцем и днем для указанного календаря.

System_CAPS_pubmethodDateTime(Int32, Int32, Int32, Int32, Int32, Int32)

Инициализирует новый экземпляр структуры DateTime заданным годом, месяцем, днем, часом, минутой и секундой.

System_CAPS_pubmethodDateTime(Int32, Int32, Int32, Int32, Int32, Int32, Calendar)

Инициализирует новый экземпляр структуры DateTime указанным годом, месяцем, днем, часом, минутой и секундой для заданного календаря.

System_CAPS_pubmethodDateTime(Int32, Int32, Int32, Int32, Int32, Int32, DateTimeKind)

Инициализирует новый экземпляр структуры DateTime заданными значениями года, месяца, дня, часа, минуты и секунды, а также временем UTC или местным временем.

System_CAPS_pubmethodDateTime(Int32, Int32, Int32, Int32, Int32, Int32, Int32)

Инициализирует новый экземпляр структуры DateTime заданным годом, месяцем, днем, часом, минутой, секундой и миллисекундой.

System_CAPS_pubmethodDateTime(Int32, Int32, Int32, Int32, Int32, Int32, Int32, Calendar)

Инициализирует новый экземпляр структуры DateTime указанным годом, месяцем, днем, часом, минутой, секундой и миллисекундой для заданного календаря.

System_CAPS_pubmethodDateTime(Int32, Int32, Int32, Int32, Int32, Int32, Int32, Calendar, DateTimeKind)

Инициализирует новый экземпляр структуры DateTime заданными значениями года, месяца, дня, часа, минуты, секунды и миллисекунды, а также временем UTC или местным временем для заданного календаря.

System_CAPS_pubmethodDateTime(Int32, Int32, Int32, Int32, Int32, Int32, Int32, DateTimeKind)

Инициализирует новый экземпляр структуры DateTime заданными значениями года, месяца, дня, часа, минуты, секунды и миллисекунды, а также временем UTC или местным временем.

System_CAPS_pubmethodDateTime(Int64)

Инициализирует новый экземпляр структуры DateTime заданным числом тактов.

System_CAPS_pubmethodDateTime(Int64, DateTimeKind)

Инициализирует новый экземпляр структуры DateTime заданным числом тактов и временем UTC или местным временем.

ИмяОписание
System_CAPS_pubpropertyDate

Возвращает компоненту даты этого экземпляра.

System_CAPS_pubpropertyDay

Возвращает день месяца, представленный этим экземпляром.

System_CAPS_pubpropertyDayOfWeek

Возвращает день недели, представленный этим экземпляром.

System_CAPS_pubpropertyDayOfYear

Возвращает день года, представленный этим экземпляром.

System_CAPS_pubpropertyHour

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

System_CAPS_pubpropertyKind

Возвращает значение, указывающее, на каком времени основано время, представленное этим экземпляром: местном, UTC или ни на том, ни на другом.

System_CAPS_pubpropertyMillisecond

Возвращает компонент миллисекунд для даты, представленной в данном экземпляре.

System_CAPS_pubpropertyMinute

Возвращает значение минут для даты, представленной этим экземпляром.

System_CAPS_pubpropertyMonth

Возвращает значение месяца для даты, представленной этим экземпляром.

System_CAPS_pubpropertySystem_CAPS_staticNow

Возвращает объект DateTime, которому присвоены текущие дата и время данного компьютера, выраженные как местное время.

System_CAPS_pubpropertySecond

Возвращает компонент секунды даты, представленной этим экземпляром.

System_CAPS_pubpropertyTicks

Возвращает число тактов, которое представляет дату и время этого экземпляра.

System_CAPS_pubpropertyTimeOfDay

Возвращает время дня для этого экземпляра.

System_CAPS_pubpropertySystem_CAPS_staticToday

Возвращает текущую дату.

System_CAPS_pubpropertySystem_CAPS_staticUtcNow

Возвращает объект DateTime, которому присвоены текущие дата и время данного компьютера, выраженные в формате UTC.

System_CAPS_pubpropertyYear

Возвращает компонент года даты, представленной этим экземпляром.

ИмяОписание
System_CAPS_pubmethodAdd(TimeSpan)

Возвращает новый объект DateTime, добавляющий значение заданного объекта TimeSpan к значению данного экземпляра.

System_CAPS_pubmethodAddDays(Double)

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

System_CAPS_pubmethodAddHours(Double)

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

System_CAPS_pubmethodAddMilliseconds(Double)

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

System_CAPS_pubmethodAddMinutes(Double)

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

System_CAPS_pubmethodAddMonths(Int32)

Возвращает новый объект DateTime, добавляющий заданное число месяцев к значению данного экземпляра.

System_CAPS_pubmethodAddSeconds(Double)

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

System_CAPS_pubmethodAddTicks(Int64)

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

System_CAPS_pubmethodAddYears(Int32)

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

System_CAPS_pubmethodSystem_CAPS_staticCompare(DateTime, DateTime)

Сравнивает два экземпляра объекта DateTime и возвращает целое число, которое показывает, предшествует ли первый экземпляр второму, совпадает или расположен позже.

System_CAPS_pubmethodCompareTo(DateTime)

Сравнивает значение данного экземпляра с заданным значением DateTime и возвращает целочисленное значение, указывающее, когда наступает момент, заданный в данном экземпляре: раньше, позже или одновременно с моментом, заданным значением DateTime.

System_CAPS_pubmethodCompareTo(Object)

Сравнивает значение данного экземпляра с заданным объектом, содержащим указанное значение DateTime, и возвращает целочисленное значение, указывающее, когда наступает момент, заданный в данном экземпляре: раньше, позже или одновременно с моментом, заданным значением DateTime.

System_CAPS_pubmethodSystem_CAPS_staticDaysInMonth(Int32, Int32)

Возвращает число дней в указанном месяце указанного года.

System_CAPS_pubmethodEquals(DateTime)

Возвращает значение, указывающее, равно ли значение данного экземпляра значению указанного экземпляра DateTime.

System_CAPS_pubmethodSystem_CAPS_staticEquals(DateTime, DateTime)

Возвращает значение, указывающее, содержат ли два экземпляра DateTime одно и то же значение даты и времени.

System_CAPS_pubmethodEquals(Object)

Возвращает значение, показывающее, равен ли данный экземпляр заданному объекту.(Переопределяет ValueType.Equals(Object).)

System_CAPS_pubmethodSystem_CAPS_staticFromBinary(Int64)

Десериализует 64-разрядное значение и воссоздает исходный сериализованный объект DateTime.

System_CAPS_pubmethodSystem_CAPS_staticFromFileTime(Int64)

Преобразует заданное время файла Windows в его эквивалент по местному времени.

System_CAPS_pubmethodSystem_CAPS_staticFromFileTimeUtc(Int64)

Преобразует заданное время файла Windows в его UTC-эквивалент.

System_CAPS_pubmethodSystem_CAPS_staticFromOADate(Double)

Возвращает объект DateTime, эквивалентный заданному значению даты OLE-автоматизации.

System_CAPS_pubmethodGetDateTimeFormats()

Преобразует значение этого экземпляра во все строковые представления, поддерживаемые стандартным форматом даты и времени.

System_CAPS_pubmethodGetDateTimeFormats(Char)

Преобразует значение этого экземпляра во все строковые представления, поддерживаемые указанным стандартным спецификатором формата даты и времени.

System_CAPS_pubmethodGetDateTimeFormats(Char, IFormatProvider)

Преобразует значение этого экземпляра во все строковые представления, поддерживаемые указанным стандартным спецификатором формата даты и времени и сведениями о форматировании, связанными с языком и региональными параметрами.

System_CAPS_pubmethodGetDateTimeFormats(IFormatProvider)

Преобразует значение этого экземпляра во все строковые представления, поддерживаемые стандартными спецификаторами формата даты и времени и указанными сведениями о форматировании, связанными с языком и региональными параметрами.

System_CAPS_pubmethodGetHashCode()

Возвращает хэш-код для текущего экземпляра. (Переопределяет ValueType.GetHashCode().)

System_CAPS_pubmethodGetType()

Возвращает объект Type для текущего экземпляра.(Наследуется от Object.)

System_CAPS_pubmethodGetTypeCode()

Возвращает TypeCode для типа значения DateTime.

System_CAPS_pubmethodIsDaylightSavingTime()

Указывает, попадает ли данный экземпляр объекта DateTime в диапазон летнего времени для текущего часового пояса.

System_CAPS_pubmethodSystem_CAPS_staticIsLeapYear(Int32)

Возвращает сведения о том, является ли указанный год високосным.

System_CAPS_pubmethodSystem_CAPS_staticParse(String)

Преобразует строковое представление даты и времени в его эквивалент DateTime.

System_CAPS_pubmethodSystem_CAPS_staticParse(String, IFormatProvider)

Преобразует строковое представление даты и времени в его эквивалент DateTime, используя сведения о форматировании, связанные с языком и региональными параметрами.

System_CAPS_pubmethodSystem_CAPS_staticParse(String, IFormatProvider, DateTimeStyles)

Преобразует строковое представление даты и времени в его эквивалент DateTime, используя указанные сведения о форматировании, связанные с языком и региональными параметрами, а также стиль.

System_CAPS_pubmethodSystem_CAPS_staticParseExact(String, String, IFormatProvider)

Преобразует заданное строковое представление даты и времени в его эквивалент DateTime, используя указанные сведения о форматировании, связанные с языком и региональными параметрами. Формат строкового представления должен полностью соответствовать заданному формату.

System_CAPS_pubmethodSystem_CAPS_staticParseExact(String, String, IFormatProvider, DateTimeStyles)

Преобразует заданное строковое представление даты и времени в его эквивалент DateTime, используя заданный формат, указанные сведения о форматировании, связанные с языком и региональными параметрами, а также стиль. Формат строкового представления должен полностью соответствовать заданному формату. В противном случае возникает исключение.

System_CAPS_pubmethodSystem_CAPS_staticParseExact(String, String[], IFormatProvider, DateTimeStyles)

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

System_CAPS_pubmethodSystem_CAPS_staticSpecifyKind(DateTime, DateTimeKind)

Создает объект DateTime, имеющий то же количество тактов, что и заданный объект DateTime, но предназначенный для использования с местным временем, со стандартом UTC, либо ни с тем, ни с другим, как определено значением DateTimeKind.

System_CAPS_pubmethodSubtract(DateTime)

Вычитает из этого экземпляра указанную дату и время.

System_CAPS_pubmethodSubtract(TimeSpan)

Вычитает из этого экземпляра указанную длительность.

System_CAPS_pubmethodToBinary()

Сериализует текущий объект DateTime в 64-разрядное двоичное значение, которое может использоваться в дальнейшем для воссоздания объекта DateTime.

System_CAPS_pubmethodToFileTime()

Преобразует значение текущего объекта DateTime во временную характеристику файла Windows.

System_CAPS_pubmethodToFileTimeUtc()

Преобразует значение текущего объекта DateTime во временную характеристику файла Windows.

System_CAPS_pubmethodToLocalTime()

Преобразует значение текущего объекта DateTime в местное время.

System_CAPS_pubmethodToLongDateString()

Преобразует значение текущего объекта DateTime в эквивалентное ему длинное строковое представление даты.

System_CAPS_pubmethodToLongTimeString()

Преобразует значение текущего объекта DateTime в эквивалентное ему длинное строковое представление времени.

System_CAPS_pubmethodToOADate()

Преобразует числовое значение этого экземпляра в эквивалентное ему значение даты OLE-автоматизации.

System_CAPS_pubmethodToShortDateString()

Преобразует значение текущего объекта DateTime в эквивалентное ему короткое строковое представление даты.

System_CAPS_pubmethodToShortTimeString()

Преобразует значение текущего объекта DateTime в эквивалентное ему короткое строковое представление времени.

System_CAPS_pubmethodToString()

Преобразует значение текущего объекта DateTime в эквивалентное строковое представление с помощью соглашений о форматировании для текущего языка и региональных параметров.(Переопределяет ValueType.ToString().)

System_CAPS_pubmethodToString(IFormatProvider)

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

System_CAPS_pubmethodToString(String)

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

System_CAPS_pubmethodToString(String, IFormatProvider)

Преобразует значение текущего объекта DateTime в эквивалентное ему строковое представление с использованием указанного формата и сведений об особенностях формата для данного языка и региональных параметров.

System_CAPS_pubmethodToUniversalTime()

Преобразует значение текущего объекта DateTime во время UTC.

System_CAPS_pubmethodSystem_CAPS_staticTryParse(String, DateTime)

Преобразовывает указанное строковое представление даты и времени в его эквивалент DateTime и возвращает значение, позволяющее определить успешность преобразования.

System_CAPS_pubmethodSystem_CAPS_staticTryParse(String, IFormatProvider, DateTimeStyles, DateTime)

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

System_CAPS_pubmethodSystem_CAPS_staticTryParseExact(String, String, IFormatProvider, DateTimeStyles, DateTime)

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

System_CAPS_pubmethodSystem_CAPS_staticTryParseExact(String, String[], IFormatProvider, DateTimeStyles, DateTime)

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

ИмяОписание
System_CAPS_pubfieldSystem_CAPS_staticMaxValue

Представляет наибольшее возможное значение типа DateTime. Это поле доступно только для чтения.

System_CAPS_pubfieldSystem_CAPS_staticMinValue

Представляет минимально допустимое значение типа DateTime. Это поле доступно только для чтения.

ИмяОписание
System_CAPS_puboperatorSystem_CAPS_staticAddition(DateTime, TimeSpan)

Прибавляет указанный временной интервал к заданной дате и времени, возвращая новую дату и время.

System_CAPS_puboperatorSystem_CAPS_staticEquality(DateTime, DateTime)

Определяет, равны ли два заданных экземпляра класса DateTime.

System_CAPS_puboperatorSystem_CAPS_staticGreaterThan(DateTime, DateTime)

Определяет, является ли значение одного заданного объекта DateTime более поздним относительно другого заданного объекта DateTime.

System_CAPS_puboperatorSystem_CAPS_staticGreaterThanOrEqual(DateTime, DateTime)

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

System_CAPS_puboperatorSystem_CAPS_staticInequality(DateTime, DateTime)

Определяет, являются ли два заданных экземпляра класса DateTime неравными.

System_CAPS_puboperatorSystem_CAPS_staticLessThan(DateTime, DateTime)

Определяет, является ли значение одного заданного объекта DateTime более ранним относительно другого заданного объекта DateTime.

System_CAPS_puboperatorSystem_CAPS_staticLessThanOrEqual(DateTime, DateTime)

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

System_CAPS_puboperatorSystem_CAPS_staticSubtraction(DateTime, DateTime)

Вычитает указанную дату и время из другой указанной даты и времени и возвращает временной интервал.

System_CAPS_puboperatorSystem_CAPS_staticSubtraction(DateTime, TimeSpan)

Вычитает заданный временной интервал из указанной даты и времени и возвращает новую дату и время.

ИмяОписание
System_CAPS_pubinterfaceSystem_CAPS_privmethodIConvertible.ToBoolean(IFormatProvider)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Данное преобразование не поддерживается. При попытке использовать этот метод выбрасывается исключение InvalidCastException.

System_CAPS_pubinterfaceSystem_CAPS_privmethodIConvertible.ToByte(IFormatProvider)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Данное преобразование не поддерживается. При попытке использовать этот метод выбрасывается исключение InvalidCastException.

System_CAPS_pubinterfaceSystem_CAPS_privmethodIConvertible.ToChar(IFormatProvider)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Данное преобразование не поддерживается. При попытке использовать этот метод выбрасывается исключение InvalidCastException.

System_CAPS_pubinterfaceSystem_CAPS_privmethodIConvertible.ToDateTime(IFormatProvider)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Возвращает текущий объект DateTime.

System_CAPS_pubinterfaceSystem_CAPS_privmethodIConvertible.ToDecimal(IFormatProvider)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Данное преобразование не поддерживается. При попытке использовать этот метод выбрасывается исключение InvalidCastException.

System_CAPS_pubinterfaceSystem_CAPS_privmethodIConvertible.ToDouble(IFormatProvider)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Данное преобразование не поддерживается. При попытке использовать этот метод выбрасывается исключение InvalidCastException.

System_CAPS_pubinterfaceSystem_CAPS_privmethodIConvertible.ToInt16(IFormatProvider)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Данное преобразование не поддерживается. При попытке использовать этот метод выбрасывается исключение InvalidCastException.

System_CAPS_pubinterfaceSystem_CAPS_privmethodIConvertible.ToInt32(IFormatProvider)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Данное преобразование не поддерживается. При попытке использовать этот метод выбрасывается исключение InvalidCastException.

System_CAPS_pubinterfaceSystem_CAPS_privmethodIConvertible.ToInt64(IFormatProvider)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Данное преобразование не поддерживается. При попытке использовать этот метод выбрасывается исключение InvalidCastException.

System_CAPS_pubinterfaceSystem_CAPS_privmethodIConvertible.ToSByte(IFormatProvider)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Данное преобразование не поддерживается. При попытке использовать этот метод выбрасывается исключение InvalidCastException.

System_CAPS_pubinterfaceSystem_CAPS_privmethodIConvertible.ToSingle(IFormatProvider)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Данное преобразование не поддерживается. При попытке использовать этот метод выбрасывается исключение InvalidCastException.

System_CAPS_pubinterfaceSystem_CAPS_privmethodIConvertible.ToType(Type, IFormatProvider)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Преобразует текущий объект DateTime в объект заданного типа.

System_CAPS_pubinterfaceSystem_CAPS_privmethodIConvertible.ToUInt16(IFormatProvider)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Данное преобразование не поддерживается. При попытке использовать этот метод выбрасывается исключение InvalidCastException.

System_CAPS_pubinterfaceSystem_CAPS_privmethodIConvertible.ToUInt32(IFormatProvider)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Данное преобразование не поддерживается. При попытке использовать этот метод выбрасывается исключение InvalidCastException.

System_CAPS_pubinterfaceSystem_CAPS_privmethodIConvertible.ToUInt64(IFormatProvider)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Данное преобразование не поддерживается. При попытке использовать этот метод выбрасывается исключение InvalidCastException.

System_CAPS_pubinterfaceSystem_CAPS_privmethodISerializable.GetObjectData(SerializationInfo, StreamingContext)

Заполняет объект SerializationInfo данными, необходимыми для сериализации текущего объекта DateTime.

System_CAPS_noteПримечание

Исходный код .NET Framework для этого типа см. в разделе Reference Source. Выполнять поиск исходного кода в Интернете, справочник для автономной работы и пошагово источники (включая исправления и обновления) во время отладки; see instructions.

DateTime Тип значения представляет дату и время в диапазоне от 00:00:00 (полночь) 1 января 0001 года (нашей эры) до 23:59:59, 31 декабря 9999 года н. э. (Н.Э.) по григорианскому календарю.

Значения времени измеряются в 100-наносекундных единицах, называемых тактами, и точная Дата представляется числом тактов с 00:00 1 января 0001 года нашей эры. (Н.Э.) в GregorianCalendar календаря (за исключением тактов, которое будет добавлено по корректировочных секунд). Например значение тактов, равное 31241376000000000L представляет дату, пятница, 1 января, 0100 12:00:00 (полночь). Объект DateTime всегда выражается в контексте явно определенного или календаря по умолчанию.

System_CAPS_noteПримечание

Если вы работаете со значением тактов, который нужно преобразовать в другой интервал времени, например минут или секунд, следует использовать TimeSpan.TicksPerDay, TimeSpan.TicksPerHour, TimeSpan.TicksPerMinute, TimeSpan.TicksPerSecond, или TimeSpan.TicksPerMillisecond константу, чтобы выполнить преобразование. Например, чтобы добавить время в секундах представлен на заданное число тактов, Second компонент DateTime значение, можно использовать выражение dateValue.Second + nTicks/Timespan.TicksPerSecond.

Содержание

Создание экземпляра объекта даты и времени
Значения DateTime и их строковые представления
Преобразование строк в значения даты и времени
Описание версии
Значения даты и времени
Операции типа DateTime
Разрешение типа DateTime
Vs даты и времени. TimeSpan
Значения даты и времени и календарей
Сохранение значений даты и времени
Вопросы взаимодействия COM

Можно создать новую DateTime значения в любой из следующих способов:

  • Можно вызвать любую из перегрузок DateTime конструктор, который позволяет указать определенные элементы значения даты и времени (например, год, месяц и день месяца или количества тактов). В следующей инструкции показан вызов одной из DateTime конструкторов для создания даты с определенный год, месяц, день, час, минуту и секунду.

    DateTime date1 = new DateTime(2008, 5, 1, 8, 30, 52);
    
  • С помощью любой синтаксис компилятора для объявления значений даты и времени. Например, следующая инструкция Visual Basic инициализирует новую DateTime значение.

    Dim date1 As Date = #5/1/2008 8:30:52AM#
    
  • Назначив DateTime значение даты и времени, возвращенные свойства или метода объекта. В следующем примере присваивается текущая дата и время, текущую дату по Гринвичу (UTC) и времени и текущей даты до трех новых DateTime переменных.

    DateTime date1 = DateTime.Now;
    DateTime date2 = DateTime.UtcNow;
    DateTime date3 = DateTime.Today;
    
  • Путем анализа строковое представление значения даты и времени. Parse, ParseExact, TryParse, И TryParseExact все методы преобразования строки в его эквивалентное значение даты и времени. В следующем примере используется Parse метод для разбора строки и преобразовать его в DateTime значение.

    string dateString = "5/1/2008 8:30:52 AM";
    DateTime date1 = DateTime.Parse(dateString, 
                              System.Globalization.CultureInfo.InvariantCulture); 
    

    Обратите внимание, что TryParse и TryParseExact методы укажите, содержит ли строка определенной допустимым представлением DateTime значение, а также выполнять преобразование.

  • Путем вызова DateTime структуры неявного конструктора по умолчанию. (Подробнее неявного конструктора по умолчанию тип значения в разделе Типы значений (Справочник по C#).) Объявление Приблизительный аналог, для компиляторов, поддерживающих ее, DateTime значение без явного присвоения даты и времени к нему. В следующем примере показан вызов DateTime неявного конструктора по умолчанию в C# и Visual Basic, а также DateTime объявления переменной, которой нет в Visual Basic.

    DateTime dat1 = new DateTime();
    // The following method call displays 1/1/0001 12:00:00 AM.
    Console.WriteLine(dat1.ToString(System.Globalization.CultureInfo.InvariantCulture));
    // The following method call displays True.
    Console.WriteLine(dat1.Equals(DateTime.MinValue));
    

На внутреннем уровне все DateTime значения представлены в виде количества тактов (количество 100-наносекундных интервалов), прошедших с полуночи в 12:00:00, 1 января 0001 г. Фактический DateTime значение не зависит от того, появляется это значение, при отображении в элементе пользовательского интерфейса или при записи в файл. Внешний вид DateTime значение является результатом операции форматирования. Форматирование — это процесс преобразования значения в строковое представление.

Так как внешний вид значений даты и времени зависит от таких факторов, как язык и региональные параметры, международные стандарты, требования приложения и предпочтений, DateTime структура обеспечивает большую гибкость при форматировании значений даты и времени с помощью перегрузок его ToString метод. Значение по умолчанию DateTime.ToString() метод возвращает строковое представление значения даты и времени, с помощью короткого формата даты и длинный формат времени текущего языка и региональных параметров. В следующем примере используется значение по умолчанию DateTime.ToString() метод для отображения даты и времени с помощью короткого формата даты и длинный формат времени для en US язык и региональные параметры, текущего языка и региональных параметров на компьютере, на котором выполняется.

DateTime date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString());
// For en-US culture, displays 3/1/2008 7:00:00 AM

DateTime.ToString(IFormatProvider) Метод возвращает строковое представление значения даты и времени, с помощью короткого формата даты и полный шаблон времени определенного языка и региональных параметров. В следующем примере используется DateTime.ToString(IFormatProvider) метод для отображения даты и времени с помощью короткого формата даты и длинный формат времени региональных параметров fr-FR.

DateTime date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString(System.Globalization.CultureInfo.CreateSpecificCulture("fr-FR")));
// Displays 01/03/2008 07:00:00

DateTime.ToString(String) Метод возвращает строковое представление даты и времени в формате, определяемой описателя стандартного или пользовательского формата и с использованием соглашений о форматировании текущего языка и региональных параметров. В следующем примере используется DateTime.ToString(String) метод, чтобы отобразить полный шаблон даты и времени для en US язык и региональные параметры, текущего языка и региональных параметров на компьютере, на котором выполняется.

DateTime date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString("F"));
// Displays Saturday, March 01, 2008 7:00:00 AM

DateTime.ToString(String, IFormatProvider) Метод возвращает строковое представление даты и времени в формате, определяемой спецификатор определенного формата и с использованием соглашений о форматировании для определенного языка и региональных параметров. В следующем примере используется DateTime.ToString(String, IFormatProvider) метод, чтобы отобразить полный шаблон даты и времени для региональных параметров fr-FR.

DateTime date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString("F", new System.Globalization.CultureInfo("fr-FR")));
// Displays samedi 1 mars 2008 07:00:00

Дополнительные сведения о форматировании DateTime значения, в разделе Строки стандартных форматов даты и времени и Строки настраиваемых форматов даты и времени.

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

  • Они представляют даты и времени, который может принимать различные формы, и которые соответствуют правилам конкретного языка и региональных параметров или текущего языка и региональных параметров. Например приложение может пользователя, которого текущими региональными параметрами являются en US для ввода значения даты как «12/15/2013» или «15 декабря 2013 г.», и выполнение пользователя, которого текущими региональными параметрами являются en-GB для ввода значения даты как «12/15/2013» или «15 декабря 2013».

  • Они представляют даты и времени в стандартных форматов. Например приложение может сериализовать даты в виде «20130103» независимо от языка и региональных параметров, на котором выполняется приложение или необходимо быть входным, дату в формате короткой даты текущего языка и региональных параметров.

Можно использовать Parse или TryParse метод для преобразования строки, которая может отражают один из стандартных форматов даты и времени для языка и региональных параметров DateTime значение. В следующем примере показано, как использовать TryParse для преобразования строки даты в ряде различных форматов конкретного языка и региональных параметров для DateTime значение. Он сменит текущий язык на английский (Великобритания) и вызывает метод GetDateTimeFormats() метод для создания массива строк даты и времени. Затем передает каждого элемента в массиве, с которой TryParse метод. Выходные данные примера показывает, что метод синтаксического анализа был успешно преобразовать каждый из конкретного языка и региональных параметров строки даты и времени.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Threading;

public class Example
{
   public static void Main()
   {
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");

      DateTime date1 = new DateTime(2013, 6, 1, 12, 32, 30);
      List<string> badFormats = new List<String>();

      Console.WriteLine("{0,-37} {1,-19}\n", "Date String", "Date");
      foreach (var dateString in date1.GetDateTimeFormats()) {
         DateTime parsedDate;
         if (DateTime.TryParse(dateString, out parsedDate))
            Console.WriteLine("{0,-37} {1,-19}", dateString, DateTime.Parse(dateString));
         else
            badFormats.Add(dateString);
      } 

      // Display strings that could not be parsed.
      if (badFormats.Count > 0) {
         Console.WriteLine("\nStrings that could not be parsed: ");
         foreach (var badFormat in badFormats)
            Console.WriteLine("   {0}", badFormat);         
      }
   }
}
// The example displays the following output:
//       Date String                           Date               
//       
//       01/06/2013                            01/06/2013 00:00:00
//       01/06/13                              01/06/2013 00:00:00
//       1/6/13                                01/06/2013 00:00:00
//       1.6.13                                01/06/2013 00:00:00
//       2013-06-01                            01/06/2013 00:00:00
//       01 June 2013                          01/06/2013 00:00:00
//       1 June 2013                           01/06/2013 00:00:00
//       01 June 2013 12:32                    01/06/2013 12:32:00
//       01 June 2013 12:32                    01/06/2013 12:32:00
//       01 June 2013 12:32 PM                 01/06/2013 12:32:00
//       01 June 2013 12:32 PM                 01/06/2013 12:32:00
//       1 June 2013 12:32                     01/06/2013 12:32:00
//       1 June 2013 12:32                     01/06/2013 12:32:00
//       1 June 2013 12:32 PM                  01/06/2013 12:32:00
//       1 June 2013 12:32 PM                  01/06/2013 12:32:00
//       01 June 2013 12:32:30                 01/06/2013 12:32:30
//       01 June 2013 12:32:30                 01/06/2013 12:32:30
//       01 June 2013 12:32:30 PM              01/06/2013 12:32:30
//       01 June 2013 12:32:30 PM              01/06/2013 12:32:30
//       1 June 2013 12:32:30                  01/06/2013 12:32:30
//       1 June 2013 12:32:30                  01/06/2013 12:32:30
//       1 June 2013 12:32:30 PM               01/06/2013 12:32:30
//       1 June 2013 12:32:30 PM               01/06/2013 12:32:30
//       01/06/2013 12:32                      01/06/2013 12:32:00
//       01/06/2013 12:32                      01/06/2013 12:32:00
//       01/06/2013 12:32 PM                   01/06/2013 12:32:00
//       01/06/2013 12:32 PM                   01/06/2013 12:32:00
//       01/06/13 12:32                        01/06/2013 12:32:00
//       01/06/13 12:32                        01/06/2013 12:32:00
//       01/06/13 12:32 PM                     01/06/2013 12:32:00
//       01/06/13 12:32 PM                     01/06/2013 12:32:00
//       1/6/13 12:32                          01/06/2013 12:32:00
//       1/6/13 12:32                          01/06/2013 12:32:00
//       1/6/13 12:32 PM                       01/06/2013 12:32:00
//       1/6/13 12:32 PM                       01/06/2013 12:32:00
//       1.6.13 12:32                          01/06/2013 12:32:00
//       1.6.13 12:32                          01/06/2013 12:32:00
//       1.6.13 12:32 PM                       01/06/2013 12:32:00
//       1.6.13 12:32 PM                       01/06/2013 12:32:00
//       2013-06-01 12:32                      01/06/2013 12:32:00
//       2013-06-01 12:32                      01/06/2013 12:32:00
//       2013-06-01 12:32 PM                   01/06/2013 12:32:00
//       2013-06-01 12:32 PM                   01/06/2013 12:32:00
//       01/06/2013 12:32:30                   01/06/2013 12:32:30
//       01/06/2013 12:32:30                   01/06/2013 12:32:30
//       01/06/2013 12:32:30 PM                01/06/2013 12:32:30
//       01/06/2013 12:32:30 PM                01/06/2013 12:32:30
//       01/06/13 12:32:30                     01/06/2013 12:32:30
//       01/06/13 12:32:30                     01/06/2013 12:32:30
//       01/06/13 12:32:30 PM                  01/06/2013 12:32:30
//       01/06/13 12:32:30 PM                  01/06/2013 12:32:30
//       1/6/13 12:32:30                       01/06/2013 12:32:30
//       1/6/13 12:32:30                       01/06/2013 12:32:30
//       1/6/13 12:32:30 PM                    01/06/2013 12:32:30
//       1/6/13 12:32:30 PM                    01/06/2013 12:32:30
//       1.6.13 12:32:30                       01/06/2013 12:32:30
//       1.6.13 12:32:30                       01/06/2013 12:32:30
//       1.6.13 12:32:30 PM                    01/06/2013 12:32:30
//       1.6.13 12:32:30 PM                    01/06/2013 12:32:30
//       2013-06-01 12:32:30                   01/06/2013 12:32:30
//       2013-06-01 12:32:30                   01/06/2013 12:32:30
//       2013-06-01 12:32:30 PM                01/06/2013 12:32:30
//       2013-06-01 12:32:30 PM                01/06/2013 12:32:30
//       01 June                               01/06/2013 00:00:00
//       01 June                               01/06/2013 00:00:00
//       2013-06-01T12:32:30.0000000           01/06/2013 12:32:30
//       2013-06-01T12:32:30.0000000           01/06/2013 12:32:30
//       Sat, 01 Jun 2013 12:32:30 GMT         01/06/2013 05:32:30
//       Sat, 01 Jun 2013 12:32:30 GMT         01/06/2013 05:32:30
//       2013-06-01T12:32:30                   01/06/2013 12:32:30
//       12:32                                 22/04/2013 12:32:00
//       12:32                                 22/04/2013 12:32:00
//       12:32 PM                              22/04/2013 12:32:00
//       12:32 PM                              22/04/2013 12:32:00
//       12:32:30                              22/04/2013 12:32:30
//       12:32:30                              22/04/2013 12:32:30
//       12:32:30 PM                           22/04/2013 12:32:30
//       12:32:30 PM                           22/04/2013 12:32:30
//       2013-06-01 12:32:30Z                  01/06/2013 05:32:30
//       01 June 2013 19:32:30                 01/06/2013 19:32:30
//       01 June 2013 19:32:30                 01/06/2013 19:32:30
//       01 June 2013 07:32:30 PM              01/06/2013 19:32:30
//       01 June 2013 7:32:30 PM               01/06/2013 19:32:30
//       1 June 2013 19:32:30                  01/06/2013 19:32:30
//       1 June 2013 19:32:30                  01/06/2013 19:32:30
//       1 June 2013 07:32:30 PM               01/06/2013 19:32:30
//       1 June 2013 7:32:30 PM                01/06/2013 19:32:30
//       June 2013                             01/06/2013 00:00:00
//       June 2013                             01/06/2013 00:00:00

Можно использовать TryParse и TryParseExact методы для преобразования строки даты и времени, которое должно соответствовать определенному формату или форматы DateTime значение. Укажите требуемый формат или форматов как параметр для анализа methodby с помощью одного или нескольких или строки формата даты и времени. В следующем примере используется TryParseExact(String, String[], IFormatProvider, DateTimeStyles, DateTime) метод для преобразования строк, которые должны быть в формате «ГГГГММДД» или в формате «ЧЧММСС» в DateTime значения.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      string[] formats = { "yyyyMMdd", "HHmmss" };
      string[] dateStrings = { "20130816", "20131608", "  20130816   ", 
                               "115216", "521116", "  115216  " };
      DateTime parsedDate;

      foreach (var dateString in dateStrings) {
         if (DateTime.TryParseExact(dateString, formats, null, 
                                    DateTimeStyles.AllowWhiteSpaces |
                                    DateTimeStyles.AdjustToUniversal,
                                    out parsedDate))
            Console.WriteLine("{0} --> {1:g}", dateString, parsedDate);
         else
            Console.WriteLine("Cannot convert {0}", dateString);
      }
   }
}
// The example displays the following output:
//       20130816 --> 8/16/2013 12:00 AM
//       Cannot convert 20131608
//         20130816    --> 8/16/2013 12:00 AM
//       115216 --> 4/22/2013 11:52 AM
//       Cannot convert 521116
//         115216   --> 4/22/2013 11:52 AM

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

Дополнительные сведения о синтаксическом разборе значений даты и времени см. в разделе Анализ строк даты и времени в .NET Framework.

До .NET Framework версии 2.0 DateTime структура содержит 64-битовое поле, состоит из неиспользуемого 2-битовое поле, объединяются с закрытым Ticks поле, которое является полем 62-разрядное число без знака, которое содержит количество тактов, представляющее дату и время. Значение Ticks поля могут быть получены с Ticks свойство.

Начиная с .NET Framework 2.0 DateTime структура содержит 64-битовое поле, состоит из закрытого поля Kind, дополненное поле тактов. Поле Kind является 2-битовое поле, которое указывает, является ли DateTime структура представляет местное время, время в формате UTC или времени в неопределенном часовом поясе. Поле Kind используется при выполнении преобразования времени между часовыми поясами, но не для сравнения значений времени или арифметических операций. Можно получить значение поля Kind Kind свойство.

System_CAPS_noteПримечание

Это альтернатива DateTime структуры для работы со значениями даты и времени и в частности часовых поясов DateTimeOffset структуры. DateTimeOffset Структура сохраняет сведения о дате и времени в закрытом DateTime поля и время в минутах, по которым, Дата и время отличается от времени UTC в закрытом Int16 поля. Это делает возможным для DateTimeOffset значение, отражающее время в заданном часовом поясе, тогда как DateTime значение однозначно может отражают только временем UTC и временем местного часового пояса. Для получения сведений о необходимости использования DateTime структуры или DateTimeOffset структуры при работе со значениями даты и времени см. в разделе Выбор между типами DateTime, DateTimeOffset, TimeSpan и TimeZoneInfo.

Описания значений времени в DateTime типа часто выражаются с использованием стандарта по Гринвичу (UTC), являющийся международное название среднего времени по Гринвичу (GMT). Время — это время по нулевой долготе, координат UTC. Летнее время не применим в формате UTC.

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

Время в формате UTC, подходит для вычисления, сравнения и хранение даты и времени в файлах. Местное время подходит для отображения в пользовательском интерфейсе приложений для настольных систем. Часовыми поясами (например, многие веб-приложения) также нужен для работы с несколькими другими часовыми поясами.

Если Kind свойство DateTime объект DateTimeKind.Unspecified, он не указан, является ли времени, представленного местное время, время в формате UTC или время в другом часовом поясе.

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

Операции преобразования между часовыми поясами (например, между временем UTC и местным или между одного часового пояса) учитывать летнего времени, но арифметические и сравнение операции — нет.

DateTime Самой структуры предоставляет ограниченную поддержку преобразования из одного часового пояса в другой. Можно использовать ToLocalTime можно использовать метод преобразования UTC в местное время, или ToUniversalTime метод для преобразования из местного времени в формате UTC. Однако доступен полный набор методов преобразования часового пояса в TimeZoneInfo класса. С помощью этих методов, можно преобразовать время в любом из мировых часовых поясов во время в другом часовом поясе.

Вычисления и сравнения DateTime объектов имеют значение только в том случае, если они представляют время в одном часовом поясе. Можно использовать TimeZoneInfo объект для представления DateTime значения часового пояса, несмотря на то, что два слабо связаны. (Это — DateTime объект не имеет свойства, которое возвращает объект, представляющий часовой пояс, значения даты и времени, отличный от Kind свойство.) По этой причине в приложении часовому поясу приходится полагаться на некоторый внешний механизм для определения часового пояса, в котором DateTime был создан объект. Например, можно использовать структуру, которая служит оболочкой для обоих DateTime значение и TimeZoneInfo , представляющий DateTime часовой пояс этого значения. Дополнительные сведения о формате UTC в вычислениях и сравнениях DateTime значения, в разделе Выполнение арифметических операций с датами и временем.

Каждый DateTime член неявно использует григорианский календарь для выполнения своей работы, за исключением конструкторов, задающих календарь, и методы, с параметром, производных от IFormatProvider, такие как System.Globalization.DateTimeFormatInfo, которая неявно задает календарь.

Операции членами DateTime тип учитывают подробные сведения, такие как високосный год или количество дней в месяце.

Два других стандартных операций с DateTime значения включают преобразования значения даты и времени в или из строкового представления. Процесс преобразования DateTime значение в строковое представление — это операция форматирования; Дополнительные сведения о форматировании см. в разделе DateTime и их строковые представления значений. Процесс преобразования строкового представления даты и времени в DateTime значение является операция синтаксического анализа; Дополнительные сведения о синтаксическом разборе см. в разделе преобразование строк в значения даты и времени.

System_CAPS_noteПримечание

В качестве альтернативы для выполнения арифметических операций на DateTime значения для измерения затраченного времени, можно использовать Stopwatch класса.

Ticks Свойство выражает значений даты и времени в единицах одной десятимиллионной секунды, а Millisecond свойство возвращает тысячные доли секунды в значении даты и времени. Тем не менее если вы используете повторные вызовы DateTime.Now свойства измерять затраченное время и с интервалами времени, меньше 100 миллисекунд, следует отметить, что значения, возвращаемые DateTime.Now свойства зависят от системных часов, в котором в системах Windows 7 и Windows 8 с разрешением примерно 15 миллисекунд.

В следующем примере демонстрируется зависимость от текущей даты и значения времени от разрешения системных часов. В примере внешний цикл повторяется в 20 раз, а во внутреннем цикле служит для задержки внешнего цикла. Если значение счетчика внешнего цикла равно 10, вызов Thread.Sleep метод задержки пять миллисекунды. Как показывают выходные данные примера, число миллисекунд в возвращенных DateTime.Now.Milliseconds свойство изменить только после вызова Thread.Sleep.

using System;
using System.Threading;

public class Example
{
   public static void Main()
   {
      String output = "";
      for (int ctr = 0; ctr <= 20; ctr++) {
         output += String.Format("{0}\n", DateTime.Now.Millisecond);
         // Introduce a delay loop.
         for (int delay = 0; delay <= 1000; delay++)
         {}

         if (ctr == 10) {
            output += "Thread.Sleep called...\n";
            Thread.Sleep(5);
         }
      }
      Console.WriteLine(output);
   }
}
// The example displays the following output:
//       111
//       111
//       111
//       111
//       111
//       111
//       111
//       111
//       111
//       111
//       111
//       Thread.Sleep called...
//       143
//       143
//       143
//       143
//       143
//       143
//       143
//       143
//       143
//       143

DateTime И TimeSpan типы значений отличаются в том, что DateTime представляет момент времени, а TimeSpan представляет интервал времени. Это означает, например, что можно вычесть один экземпляр DateTime из другого для получения TimeSpan , представляющий интервал времени между ними. Или можно добавить положительное TimeSpan с текущим DateTime для получения DateTime значение, которое представляет дату в будущем.

Можно добавить или вычесть временной интервал из DateTime объекта. Интервалы времени может быть положительным или отрицательным, могут быть выражены в единицах, таких как такты или секунды или могут быть выражен как TimeSpan объект.

Библиотека классов .NET Framework включает ряд классов календарей, которые являются производными от Calendar класса. Они приведены ниже.

Каждый язык и региональные параметры использует календарь по умолчанию определяется его только для чтения CultureInfo.Calendar свойство и поддерживает один или несколько календарей определяется его только для чтения CultureInfo.OptionalCalendars свойство. Календарь, используемый в данный момент конкретного CultureInfo объект определяется его DateTimeFormatInfo.Calendar свойства; он должен быть одним из календарей в CultureInfo.OptionalCalendars массива.

Для региональных параметров текущего календаря используется во всех операциях форматирования для этого языка и региональных параметров. Например, по умолчанию персидский (Иран) культуры используется единой системы обмена сообщениями саудовскому календарю, который представляется UmAlQuraCalendar класса. Когда CultureInfo , представляющий язык персидский (Иран) используется в форматировании даты и времени операции единой системы обмена сообщениями по умолчанию используется саудовскому календарю и только в том случае, если используется григорианский календарь культуры DateTimeFormatInfo.Calendar изменения свойств, как показано в следующем примере.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      var faIR = new CultureInfo("fa-IR");
      var value = new DateTime(2016, 5, 28);

      Console.WriteLine(value.ToString(faIR));

      faIR.DateTimeFormat.Calendar = new GregorianCalendar();
      Console.WriteLine(value.ToString(faIR));
   }
}
// The example displays the following output:
// 08/03/1395 12:00:00 ?.?
// 28/05/2016 12:00:00 ?.?

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

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      var faIR = new CultureInfo("fa-IR");
      var value = DateTime.Parse("08/03/1395", faIR);
      Console.WriteLine(value.ToString(faIR));

      faIR.DateTimeFormat.Calendar = new GregorianCalendar();
      Console.WriteLine(value.ToString(faIR));
   }
}
// The example displays the following output:
//       08/03/1395 12:00:00 ?.?
//       28/05/2016 12:00:00 ?.?

Можно также создать экземпляр DateTime значение с помощью элементы даты и времени (например, количество год, месяц и день) конкретного календаря путем вызова конструктора DateTime , включающего calendar параметра и его передачи Calendar объекта, представляющего календарь. В следующем примере это выполняется с помощью элементов даты и времени, из UmAlQuraCalendar календаря.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      var faIR = new CultureInfo("fa-IR");
      var dat = new DateTime(1395, 8, 18, faIR.DateTimeFormat.Calendar);
      Console.WriteLine("Umm-al-Qura date: {0}", dat.ToString("d", faIR));
      Console.WriteLine("Gregorian date:   {0:d}", dat);
   }
}
// The example displays the following output:
//       Umm-al-Qura date: 18/08/1395
//       Gregorian date:   11/8/2016

DateTimeконструкторы, которые не включают calendar параметр предполагается, что элементы даты и времени представляют собой единицы по григорианскому календарю.

Все остальные DateTime свойства и методы используют григорианский календарь. Например DateTime.Year свойство возвращает год по григорианскому календарю и DateTime.IsLeapYear(Int32) метод предполагает, что year параметр — год по григорианскому календарю. Каждый DateTime элемента, который использует григорианского календаря имеет соответствующий член Calendar класс, который использует конкретного календаря. Например Calendar.GetYear метод возвращает год в календаре конкретного и Calendar.IsLeapYear метод интерпретирует year номер года в календаре конкретного параметра. В следующем примере используются оба DateTime и соответствующими элементами UmAlQuraCalendar класса.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      var faIR = new CultureInfo("fa-IR");
      var cal = faIR.DateTimeFormat.Calendar;
      var dat = new DateTime(1395, 8, 18, cal);
      Console.WriteLine("Using the Umm-al-Qura calendar:");
      Console.WriteLine("Date: {0}", dat.ToString("d", faIR));
      Console.WriteLine("Year: {0}", cal.GetYear(dat));
      Console.WriteLine("Leap year: {0}\n", 
                        cal.IsLeapYear(cal.GetYear(dat)));

      Console.WriteLine("Using the Gregorian calendar:");
      Console.WriteLine("Date: {0:d}", dat);
      Console.WriteLine("Year: {0}", dat.Year);
      Console.WriteLine("Leap year: {0}", DateTime.IsLeapYear(dat.Year));
   }
}
// The example displays the following output:
//       Using the Umm-al-Qura calendar:
//       Date: 18/08/1395
//       Year: 1395
//       Leap year: True
//       
//       Using the Gregorian calendar:
//       Date: 11/8/2016
//       Year: 2016
//       Leap year: True

Несмотря на то что DateTime структура включает в себя DayOfWeek свойство, которое возвращает день недели в григорианском календаре, он не включает член, который позволяет получить номер недели года. Для извлечения неделю года, вызовите отдельных календаря Calendar.GetWeekOfYear метод. Ниже приведен пример.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      var faIR = new CultureInfo("fa-IR");
      var umAlQura = faIR.DateTimeFormat.Calendar;
      var dat = new DateTime(1395, 8, 18, umAlQura);
      Console.WriteLine("Using the Umm-al-Qura calendar:");
      Console.WriteLine("Date: {0}", dat.ToString("d", faIR));
      Console.WriteLine("Day of Week: {0}", umAlQura.GetDayOfWeek(dat));
      Console.WriteLine("Week of year: {0}\n", 
                        umAlQura.GetWeekOfYear(dat, CalendarWeekRule.FirstDay, 
                                               DayOfWeek.Sunday));

      var greg = new GregorianCalendar(); 
      Console.WriteLine("Using the Gregorian calendar:");
      Console.WriteLine("Date: {0:d}", dat);
      Console.WriteLine("Day of Week: {0}", dat.DayOfWeek);
      Console.WriteLine("Week of year: {0}", 
                         greg.GetWeekOfYear(dat, CalendarWeekRule.FirstDay, 
                                            DayOfWeek.Sunday));
   }
}
// The example displays the following output:
//       Using the Umm-al-Qura calendar:
//       Date: 18/08/1395
//       Day of Week: Tuesday
//       Week of year: 34
//       
//       Using the Gregorian calendar:
//       Date: 11/8/2016
//       Day of Week: Tuesday
//       Week of year: 46

Дополнительные сведения о даты и календари см. в разделе Работа с календарями.

Можно сохранить DateTime значения четырьмя способами:

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

Для успешного восстановления DateTime значения, которые сохраняются в виде строки, соответствующие этим правилам:

  • Делайте же предположения о при восстановлении строки как при сохранении форматирования с учетом языка и региональных параметров. Чтобы убедиться, что строка может быть восстановлена на компьютере с региональными отличается от языка и региональных параметров системы, он был сохранен на, вызовите ToStringперегрузку, чтобы сохранить строку с использованием соглашений инвариантного языка и региональных параметров, и вызовите Parse(String, IFormatProvider, DateTimeStyles) или TryParse(String, IFormatProvider, DateTimeStyles, DateTime) перегрузку, чтобы восстановить строки с использованием соглашений инвариантного языка и региональных параметров. Никогда не используйте ToString(), Parse(String), или TryParse(String, DateTime) перегрузок, которые используются соглашения текущих региональных параметров потока.

  • Если данные представляют собой один момент времени, убедитесь, чтобы он представлял один и тот же момент времени, когда восстанавливается, даже если она восстанавливается в системе, которая используется в другом часовом поясе. Чтобы сделать это, необходимо преобразовать DateTime значение в формате UTC, до его сохранения. Можно сериализовать значение, а также сведения о часовом поясе; Дополнительные сведения об этом подходе см. в разделе данные сериализации даты и времени и часового пояса.

Наиболее распространенной ошибкой при сохранении DateTime значений в виде строк — использовать правила форматирования по умолчанию или текущего языка и региональных параметров. Проблемы возникают, если различаются, при сохранении и восстановлении строки текущего языка и региональных параметров. В следующем примере эти проблемы. Она сохраняет пять дат, используя правила форматирования текущей культуры, в данном случае это английский язык (США). Он восстанавливает дат, используя правила форматирования текущей культуры, в данном случае это английский язык (Великобритания). Поскольку соглашения о форматировании двух языков и региональных параметров не совпадают, две даты не могут быть восстановлены, и неправильной интерпретации остальные три даты. Кроме того Если исходные значения даты и времени представляют один моментам времени, восстановленный время неверны, так как сведения о часовом поясе теряются.

using System;
using System.Globalization;
using System.IO;
using System.Threading;

public class Example
{
   private const string filename = @".\BadDates.txt";

   public static void Main()
   {
      if (! File.Exists(filename))
         SaveDates();
      else
         RestoreDates();
   }

   private static void SaveDates()
   {
      DateTime[] dates = { new DateTime(2014, 6, 14, 6, 32, 0), 
                           new DateTime(2014, 7, 10, 23, 49, 0),  
                           new DateTime(2015, 1, 10, 1, 16, 0), 
                           new DateTime(2014, 12, 20, 21, 45, 0), 
                           new DateTime(2014, 6, 2, 15, 14, 0) }; 
      string output = null;

      Console.WriteLine("Current Time Zone: {0}",
                        TimeZoneInfo.Local.DisplayName);
      Console.WriteLine("The dates on an {0} system:", 
                        Thread.CurrentThread.CurrentCulture.Name);
      for (int ctr = 0; ctr < dates.Length; ctr++) { 
         Console.WriteLine(dates[ctr].ToString("f"));
         output += dates[ctr].ToString() + (ctr != dates.Length - 1 ? "|" : "");
      }
      StreamWriter sw = new StreamWriter(filename);
      sw.Write(output);
      sw.Close();
      Console.WriteLine("Saved dates...");
   }

   private static void RestoreDates()
   {
      TimeZoneInfo.ClearCachedData();
      Console.WriteLine("Current Time Zone: {0}",
                        TimeZoneInfo.Local.DisplayName);
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");
      StreamReader sr = new StreamReader(filename);
      string[] inputValues = sr.ReadToEnd().Split( new char[] { '|' } , 
                                                  StringSplitOptions.RemoveEmptyEntries);
      sr.Close();
      Console.WriteLine("The dates on an {0} system:", 
                        Thread.CurrentThread.CurrentCulture.Name);
      foreach (var inputValue in inputValues) {
         DateTime dateValue;
         if (DateTime.TryParse(inputValue, out dateValue)) {
            Console.WriteLine("'{0}' --> {1:f}", inputValue, dateValue);
         }
         else {
            Console.WriteLine("Cannot parse '{0}'", inputValue);   
         }
      }
      Console.WriteLine("Restored dates...");   
   }
}
// When saved on an en-US system, the example displays the following output:
//       Current Time Zone: (UTC-08:00) Pacific Time (US & Canada)
//       The dates on an en-US system:
//       Saturday, June 14, 2014 6:32 AM
//       Thursday, July 10, 2014 11:49 PM
//       Saturday, January 10, 2015 1:16 AM
//       Saturday, December 20, 2014 9:45 PM
//       Monday, June 02, 2014 3:14 PM
//       Saved dates...
//
// When restored on an en-GB system, the example displays the following output:
//       Current Time Zone: (UTC) Dublin, Edinburgh, Lisbon, London
//       The dates on an en-GB system:
//       Cannot parse //6/14/2014 6:32:00 AM//
//       //7/10/2014 11:49:00 PM// --> 07 October 2014 23:49
//       //1/10/2015 1:16:00 AM// --> 01 October 2015 01:16
//       Cannot parse //12/20/2014 9:45:00 PM//
//       //6/2/2014 3:14:00 PM// --> 06 February 2014 15:14
//       Restored dates...

Для приема-передачи DateTime параметры успешно, выполните следующие действия:

  1. Если значения представляют один моменты времени, преобразуются из местного времени в формате UTC, вызвав ToUniversalTime метод.

  2. Преобразование даты в их строковые представления путем вызова ToString(String, IFormatProvider) или String.Format(IFormatProvider, String, Object[]) перегрузки. Использовать правила форматирования для инвариантного языка и региональных параметров, указав CultureInfo.InvariantCulture как provider аргумент. Укажите значение следует приема-передачи с помощью «O» или «R».

  3. При вызове Parse(String, IFormatProvider, DateTimeStyles) или TryParse(String, IFormatProvider, DateTimeStyles, DateTime) метод.

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

  1. Синтаксический анализ данных, вызвав ParseExact или TryParseExact перегрузки. Укажите CultureInfo.InvariantCulture как provider аргумента и используется тот же формат стандартной строки вы использовали для format аргумента во время преобразования. Включить DateTimeStyles.RoundtripKind значение в styles аргумент.

  2. Если DateTime значения представляют один моментам времени, вызов ToLocalTime метод преобразования анализируемых данных от времени UTC в местное время.

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

using System;
using System.Globalization;
using System.IO;
using System.Threading;

public class Example
{
   private const string filename = @".\Dates.txt";

   public static void Main()
   {
      if (! File.Exists(filename))
         SaveDates();
      else
         RestoreDates();
   }

   private static void SaveDates()
   {
      DateTime[] dates = { new DateTime(2014, 6, 14, 6, 32, 0), 
                           new DateTime(2014, 7, 10, 23, 49, 0),  
                           new DateTime(2015, 1, 10, 1, 16, 0), 
                           new DateTime(2014, 12, 20, 21, 45, 0), 
                           new DateTime(2014, 6, 2, 15, 14, 0) }; 
      string output = null;

      Console.WriteLine("Current Time Zone: {0}",
                        TimeZoneInfo.Local.DisplayName);
      Console.WriteLine("The dates on an {0} system:", 
                        Thread.CurrentThread.CurrentCulture.Name);
      for (int ctr = 0; ctr < dates.Length; ctr++) { 
         Console.WriteLine(dates[ctr].ToString("f"));
         output += dates[ctr].ToUniversalTime().ToString("O", CultureInfo.InvariantCulture) 
                   + (ctr != dates.Length - 1 ? "|" : "");
      }
      StreamWriter sw = new StreamWriter(filename);
      sw.Write(output);
      sw.Close();
      Console.WriteLine("Saved dates...");
   }

   private static void RestoreDates()
   {
      TimeZoneInfo.ClearCachedData();
      Console.WriteLine("Current Time Zone: {0}",
                        TimeZoneInfo.Local.DisplayName);
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");
      StreamReader sr = new StreamReader(filename);
      string[] inputValues = sr.ReadToEnd().Split( new char[] { '|' } , 
                                                  StringSplitOptions.RemoveEmptyEntries);
      sr.Close();
      Console.WriteLine("The dates on an {0} system:", 
                        Thread.CurrentThread.CurrentCulture.Name);
      foreach (var inputValue in inputValues) {
         DateTime dateValue;
         if (DateTime.TryParseExact(inputValue, "O", CultureInfo.InvariantCulture, 
                               DateTimeStyles.RoundtripKind, out dateValue)) {
            Console.WriteLine("'{0}' --> {1:f}", 
                              inputValue, dateValue.ToLocalTime());
         }
         else {
            Console.WriteLine("Cannot parse '{0}'", inputValue);   
         }
      }
      Console.WriteLine("Restored dates...");   
   }
}
// When saved on an en-US system, the example displays the following output:
//       Current Time Zone: (UTC-08:00) Pacific Time (US & Canada)
//       The dates on an en-US system:
//       Saturday, June 14, 2014 6:32 AM
//       Thursday, July 10, 2014 11:49 PM
//       Saturday, January 10, 2015 1:16 AM
//       Saturday, December 20, 2014 9:45 PM
//       Monday, June 02, 2014 3:14 PM
//       Saved dates...
//
// When restored on an en-GB system, the example displays the following output:
//       Current Time Zone: (UTC) Dublin, Edinburgh, Lisbon, London
//       The dates on an en-GB system:
//       '2014-06-14T13:32:00.0000000Z' --> 14 June 2014 14:32
//       '2014-07-11T06:49:00.0000000Z' --> 11 July 2014 07:49
//       '2015-01-10T09:16:00.0000000Z' --> 10 January 2015 09:16
//       '2014-12-21T05:45:00.0000000Z' --> 21 December 2014 05:45
//       '2014-06-02T22:14:00.0000000Z' --> 02 June 2014 23:14
//       Restored dates...

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

Для сохранения DateTime значение как целое число:

  • Если DateTime значения представляют один моментам времени, преобразовать их в формате UTC, вызвав ToUniversalTime метод.

  • Число тактов, представленного параметром DateTime значение из его Ticks свойство.

Чтобы восстановить DateTime значения, который сохранен как целое число:

  1. Создания нового экземпляра DateTime путем передачи Int64 значение DateTime(Int64) конструктор.

  2. Если DateTime представляет один момент времени, преобразовать его от времени UTC в местное время, вызвав ToLocalTime метод.

Следующий пример сохраняет массив DateTime значения как целые числа в системе в США. тихоокеанском стандартном часовом поясе США. Он восстанавливает в системе в поясе UTC. Файл, содержащий целые числа включает Int32 значение, указывающее общее количество Int64 значения, которые непосредственно следуют за.

using System;
using System.Globalization;
using System.IO;
using System.Threading;

class Example
{
   private const string filename = @".\IntDates.bin";

   public static void Main()
   {
      if (! File.Exists(filename))
         SaveDates();
      else
         RestoreDates();
   }

   private static void SaveDates()
   {
      DateTime[] dates = { new DateTime(2014, 6, 14, 6, 32, 0), 
                           new DateTime(2014, 7, 10, 23, 49, 0),  
                           new DateTime(2015, 1, 10, 1, 16, 0), 
                           new DateTime(2014, 12, 20, 21, 45, 0), 
                           new DateTime(2014, 6, 2, 15, 14, 0) }; 

      Console.WriteLine("Current Time Zone: {0}",
                        TimeZoneInfo.Local.DisplayName);
      Console.WriteLine("The dates on an {0} system:", 
                        Thread.CurrentThread.CurrentCulture.Name);
      long[] ticks = new long[dates.Length];
      for (int ctr = 0; ctr < dates.Length; ctr++) { 
         Console.WriteLine(dates[ctr].ToString("f"));
         ticks[ctr] = dates[ctr].ToUniversalTime().Ticks; 
      }
      FileStream fs = new FileStream(filename, FileMode.Create);
      BinaryWriter bw = new BinaryWriter(fs);
      bw.Write(ticks.Length);
      foreach (var tick in ticks)
         bw.Write(tick);

      bw.Close();
      Console.WriteLine("Saved dates...");
   }

   private static void RestoreDates()
   {
      TimeZoneInfo.ClearCachedData();
      Console.WriteLine("Current Time Zone: {0}",
                        TimeZoneInfo.Local.DisplayName);
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");
      FileStream fs = new FileStream(filename, FileMode.Open);
      BinaryReader br = new BinaryReader(fs);
      int items;
      DateTime[] dates;

      try { 
         items = br.ReadInt32();
         dates = new DateTime[items];

         for (int ctr = 0; ctr < items; ctr++) {
            long ticks = br.ReadInt64();
            dates[ctr] = new DateTime(ticks).ToLocalTime();
         }
      }   
      catch (EndOfStreamException) {
         Console.WriteLine("File corruption detected. Unable to restore data...");
         return;
      }   
      catch (IOException) {
         Console.WriteLine("Unspecified I/O error. Unable to restore data...");
         return;
      }
      // Thrown during array initialization.
      catch (OutOfMemoryException) {
         Console.WriteLine("File corruption detected. Unable to restore data...");
         return;
      }
      finally {      
         br.Close();
      }   

      Console.WriteLine("The dates on an {0} system:", 
                        Thread.CurrentThread.CurrentCulture.Name);
      foreach (var value in dates)
         Console.WriteLine(value.ToString("f"));

      Console.WriteLine("Restored dates...");   
   }
}
// When saved on an en-US system, the example displays the following output:
//       Current Time Zone: (UTC-08:00) Pacific Time (US & Canada)
//       The dates on an en-US system:
//       Saturday, June 14, 2014 6:32 AM
//       Thursday, July 10, 2014 11:49 PM
//       Saturday, January 10, 2015 1:16 AM
//       Saturday, December 20, 2014 9:45 PM
//       Monday, June 02, 2014 3:14 PM
//       Saved dates...
//
// When restored on an en-GB system, the example displays the following output:
//       Current Time Zone: (UTC) Dublin, Edinburgh, Lisbon, London
//       The dates on an en-GB system:
//       14 June 2014 14:32
//       11 July 2014 07:49
//       10 January 2015 09:16
//       21 December 2014 05:45
//       02 June 2014 23:14
//       Restored dates...

Вместо сохранения DateTime значения как строки или целые числа, которые необходимо преобразовать обратно в DateTime значения, можно сохранить DateTime значения посредством сериализации поток или файл и затем восстановить их через десериализации. В этом случае DateTimeданных сериализуется в формат некоторые указанного объекта и объекты восстанавливаются при десериализации. Модуль форматирования или сериализатора, таких как XmlSerializer или BinaryFormatter, обрабатывает процесс сериализации и десериализации. Дополнительные сведения о сериализации и типы сериализации, поддерживаемые платформой .NET Framework см. в разделе Сериализация.

В следующем примере используется XmlSerializer классы для сериализации и десериализации DateTime значений, представляющих все leap дней года в-21-го века. Выходные данные представляет результат, если пример выполняется в системе, которого текущий язык — английский (Великобритания). Так как мы десериализовать DateTime самому объекту, код не должен обрабатывать региональные отличия в форматы даты и времени.

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Xml.Serialization;

class Example
{
   private const string filename = @".\LeapYears.xml";

   public static void Main()
   {
      // Serialize the data.
      List<DateTime> leapYears = new List<DateTime>();
      for (int year = 2000; year <= 2100; year += 4) {
         if (DateTime.IsLeapYear(year)) 
            leapYears.Add(new DateTime(year, 2, 29));
      }
      DateTime[] dateArray = leapYears.ToArray();

      XmlSerializer serializer = new XmlSerializer(dateArray.GetType());
      TextWriter sw = new StreamWriter(filename);

      try {
         serializer.Serialize(sw, dateArray);
      }
      catch (InvalidOperationException e) {
         Console.WriteLine(e.InnerException.Message);         
      }
      finally {
         if (sw != null) sw.Close();
      }   

      // Deserialize the data.
      DateTime[] deserializedDates;
      using (FileStream fs = new FileStream(filename, FileMode.Open)) {
         deserializedDates = (DateTime[]) serializer.Deserialize(fs);
      } 

      // Display the dates.
      Console.WriteLine("Leap year days from 2000-2100 on an {0} system:",
                        Thread.CurrentThread.CurrentCulture.Name);
      int nItems = 0;
      foreach (var dat in deserializedDates) {
         Console.Write("   {0:d}     ", dat);
         nItems++;
         if (nItems % 5 == 0) 
               Console.WriteLine(); 
      }
   }
}
// The example displays the following output:
//    Leap year days from 2000-2100 on an en-GB system:
//       29/02/2000       29/02/2004       29/02/2008       29/02/2012       29/02/2016
//       29/02/2020       29/02/2024       29/02/2028       29/02/2032       29/02/2036
//       29/02/2040       29/02/2044       29/02/2048       29/02/2052       29/02/2056
//       29/02/2060       29/02/2064       29/02/2068       29/02/2072       29/02/2076
//       29/02/2080       29/02/2084       29/02/2088       29/02/2092       29/02/2096

Предыдущий пример не включает сведения о времени. Однако если DateTime значение представляет момент времени и представляется в формате местного времени, его необходимо преобразовать из местного времени в формат UTC до сериализации его путем вызова ToUniversalTime метод. После десериализации, следует преобразовать его от времени UTC в местное время, вызвав ToLocalTime метод. В следующем примере используется BinaryFormatter класс для сериализацииDateTime данных в системе в США. Тихоокеанском стандартном часовом поясе и десериализуемые в системе в поясе UTC.

using System;
using System.IO;
using System.Globalization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;

class Example
{
   private const string filename = @".\Dates.bin";

   public static void Main()
   {
      if (! File.Exists(filename))
         SaveDates();
      else
         RestoreDates();
   }

   private static void SaveDates()
   {
      DateTime[] dates = { new DateTime(2014, 6, 14, 6, 32, 0), 
                           new DateTime(2014, 7, 10, 23, 49, 0),  
                           new DateTime(2015, 1, 10, 1, 16, 0), 
                           new DateTime(2014, 12, 20, 21, 45, 0), 
                           new DateTime(2014, 6, 2, 15, 14, 0) }; 
      FileStream fs = new FileStream(filename, FileMode.Create);
      BinaryFormatter bin = new BinaryFormatter();

      Console.WriteLine("Current Time Zone: {0}",
                        TimeZoneInfo.Local.DisplayName);
      Console.WriteLine("The dates on an {0} system:", 
                        Thread.CurrentThread.CurrentCulture.Name);
      for (int ctr = 0; ctr < dates.Length; ctr++) { 
         Console.WriteLine(dates[ctr].ToString("f"));
         dates[ctr] = dates[ctr].ToUniversalTime();
      }
      bin.Serialize(fs, dates);
      fs.Close();
      Console.WriteLine("Saved dates...");
   }

   private static void RestoreDates()
   {
      TimeZoneInfo.ClearCachedData();
      Console.WriteLine("Current Time Zone: {0}",
                        TimeZoneInfo.Local.DisplayName);
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");

      FileStream fs = new FileStream(filename, FileMode.Open);
      BinaryFormatter bin = new BinaryFormatter();
      DateTime[] dates = (DateTime[]) bin.Deserialize(fs);
      fs.Close();

      Console.WriteLine("The dates on an {0} system:", 
                        Thread.CurrentThread.CurrentCulture.Name);
      foreach (var value in dates)
         Console.WriteLine(value.ToLocalTime().ToString("f"));

      Console.WriteLine("Restored dates...");   
   }
}
// When saved on an en-US system, the example displays the following output:
//       Current Time Zone: (UTC-08:00) Pacific Time (US & Canada)
//       The dates on an en-US system:
//       Saturday, June 14, 2014 6:32 AM
//       Thursday, July 10, 2014 11:49 PM
//       Saturday, January 10, 2015 1:16 AM
//       Saturday, December 20, 2014 9:45 PM
//       Monday, June 02, 2014 3:14 PM
//       Saved dates...
//
// When restored on an en-GB system, the example displays the following output:
//       Current Time Zone: (UTC) Dublin, Edinburgh, Lisbon, London
//       The dates on an en-GB system:
//       14 June 2014 14:32
//       11 July 2014 07:49
//       10 January 2015 09:16
//       21 December 2014 05:45
//       02 June 2014 23:14
//       Restored dates...

Приведенных выше примерах все предполагается, что DateTime значения представляют собой местное время и преобразования значений между временем UTC и местным временем, они отражают один и тот же момент времени в исходных и целевых системах. DateTimeзначения также может отражают моментам времени в формате UTC и часовой пояс, отличный от local. В этом случае из-за DateTime структура несовместима с часовыми поясами, необходимо сериализовать как DateTimeзначение и TimeZoneInfo объекта, представляющего его часовой пояс. Чтобы сделать это, создать тип, поля включаются как DateTime значение и его часовым поясом. В следующем примере определяется DateWithTimeZone структуру, показано, как это можно сделать.

using System;

namespace DateTimeExtensions
{
   [Serializable] public struct DateWithTimeZone
   {
      private TimeZoneInfo tz;
      private DateTime dt;

      public DateWithTimeZone(DateTime dateValue, TimeZoneInfo timeZone)
      {
         dt = dateValue;
         if (timeZone == null)
            tz = TimeZoneInfo.Local;
         else
            tz = timeZone;
      }   

      public TimeZoneInfo TimeZone 
      { get { return (tz); }
        set { tz = value; } }

      public DateTime DateTime 
      { get { return (dt); }
        set { dt = value; } }
   }
}
System_CAPS_importantВажно

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

С помощью DateWithTimeZone структуры, могут затем сохраняться даты и времени, а также сведения о часовом поясе. В следующем примере используется BinaryFormatter класс для сериализации массив DateWithTimeZoneобъектов.

using System;
using DateTimeExtensions;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class Example
{
   public static void Main()
   {
      DateWithTimeZone[] dates= { new DateWithTimeZone(new DateTime(2014, 8, 9, 19, 30, 0),  
                                      TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")),
                                  new DateWithTimeZone(new DateTime(2014, 8, 15, 19, 0, 0), 
                                      TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time")),  
                                  new DateWithTimeZone(new DateTime(2014, 8, 22, 19, 30, 0),  
                                      TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")),  
                                  new DateWithTimeZone(new DateTime(2014, 8, 28, 19, 0, 0), 
                                      TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")) };
      FileStream fs = new FileStream(@".\Schedule.bin", FileMode.Create);
      BinaryFormatter formatter = new BinaryFormatter();
      try {
         formatter.Serialize(fs, dates);
         // Display dates.
         foreach (var date in dates) {
            TimeZoneInfo tz = date.TimeZone;
            Console.WriteLine("{0} {1}", date.DateTime, 
                              tz.IsDaylightSavingTime(date.DateTime) ? 
                              tz.DaylightName : tz.StandardName);      
         }
      }
      catch (SerializationException e) {
         Console.WriteLine("Serialization failed. Reason: {0}", e.Message);
      }   
      finally {
         if (fs != null) fs.Close();
      }
   }
}
// The example displays the following output:
//       8/9/2014 7:30:00 PM Eastern Daylight Time
//       8/15/2014 7:00:00 PM Pacific Daylight Time
//       8/22/2014 7:30:00 PM Eastern Daylight Time
//       8/28/2014 7:00:00 PM Eastern Daylight Time

Следующий пример вызывает BinaryFormatter.Deserialize метод для десериализации.

using System;
using DateTimeExtensions;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class Example
{
   private const string filename = @".\Schedule.bin";

   public static void Main()
   {
      FileStream fs;
      if (File.Exists(filename))
         fs = new FileStream(filename, FileMode.Open);
      else {
         Console.WriteLine("Unable to find file to deserialize.");
         return;
      }

      BinaryFormatter formatter = new BinaryFormatter();
      DateWithTimeZone[] dates;
      try {
         dates = (DateWithTimeZone[]) formatter.Deserialize(fs);
         // Display dates.
         foreach (var date in dates) {
            TimeZoneInfo tz = date.TimeZone;
            Console.WriteLine("{0} {1}", date.DateTime, 
                              tz.IsDaylightSavingTime(date.DateTime) ? 
                              tz.DaylightName : tz.StandardName);      
         }
      }
      catch (SerializationException e) {
         Console.WriteLine("Deserialization failed. Reason: {0}", e.Message);
      }   
      finally {
         if (fs != null) fs.Close();
      }
   }
}
// The example displays the following output:
//       8/9/2014 7:30:00 PM Eastern Daylight Time
//       8/15/2014 7:00:00 PM Pacific Daylight Time
//       8/22/2014 7:30:00 PM Eastern Daylight Time
//       8/28/2014 7:00:00 PM Eastern Daylight Time

Объект DateTime обратного преобразования, называется значение, которое передается в COM-приложение, а затем обратно в управляемом приложении. Однако DateTime не содержит значение, которое указывает только время приема-передачи, как и следует ожидать.

При каждом обращении только время, например по 3, конечная дата и время 30 декабря 1899 года нашей эры в 3:00, а не 1 января 0001 года нашей эры в 3:00. Это происходит, потому что .NET Framework и COM даты по умолчанию, если задан только раз. Однако система COM предполагает базовую дату 30 декабря 1899 г. нашей эры, хотя .NET Framework предполагает базовую дату 1 января 0001 года нашей эры

Если передается только время от платформы .NET Framework для COM, специальная обработка выполняется, преобразует время в формат, используемый в модели COM. Когда из COM в .NET Framework передается только время, никакая специальная обработка не выполняется, поскольку, может привести к повреждению допустимых дат и времени до 30 декабря 1899 г. Это также означает, что если даты начинается круговой путь из COM, платформа .NET Framework и COM сохраняют эту дату.

Поведение платформы .NET Framework и COM означает, что если циклов приема-передачи вашего приложения DateTime , указывает только время, приложение должно обязательно изменить или проигнорировать ошибочные даты с последней DateTime объекта.

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

using System;

class DateTimeTester 
{
   static bool RoughlyEquals(DateTime time, DateTime timeWithWindow, int windowInSeconds, int frequencyInSeconds)
   {
      long delta = (long)((TimeSpan)(timeWithWindow - time)).TotalSeconds 
                                                     % frequencyInSeconds;

      delta = delta > windowInSeconds ? frequencyInSeconds - delta : delta;

      return Math.Abs(delta) < windowInSeconds;
	}

	public static void Main() 
	{
      int window = 10;
      int freq = 60 * 60 * 2; // 2 hours;

      DateTime d1 = DateTime.Now;

      DateTime d2 = d1.AddSeconds(2 * window);
      DateTime d3 = d1.AddSeconds(-2 * window);
      DateTime d4 = d1.AddSeconds(window / 2);
      DateTime d5 = d1.AddSeconds(-window / 2);

      DateTime d6 = (d1.AddHours(2)).AddSeconds(2 * window);
      DateTime d7 = (d1.AddHours(2)).AddSeconds(-2 * window);
      DateTime d8 = (d1.AddHours(2)).AddSeconds(window / 2);
      DateTime d9 = (d1.AddHours(2)).AddSeconds(-window / 2);

      Console.WriteLine("d1 ({0}) ~= d1 ({1}): {2}",
                        d1, d1, RoughlyEquals(d1, d1, window, freq));
      Console.WriteLine("d1 ({0}) ~= d2 ({1}): {2}", 
                        d1, d2, RoughlyEquals(d1, d2, window, freq));
      Console.WriteLine("d1 ({0}) ~= d3 ({1}): {2}", 
                        d1, d3, RoughlyEquals(d1, d3, window, freq));
      Console.WriteLine("d1 ({0}) ~= d4 ({1}): {2}", 
                        d1, d4, RoughlyEquals(d1, d4, window, freq));
      Console.WriteLine("d1 ({0}) ~= d5 ({1}): {2}", 
                        d1, d5, RoughlyEquals(d1, d5, window, freq));

      Console.WriteLine("d1 ({0}) ~= d6 ({1}): {2}", 
                        d1, d6, RoughlyEquals(d1, d6, window, freq));
      Console.WriteLine("d1 ({0}) ~= d7 ({1}): {2}", 
                        d1, d7, RoughlyEquals(d1, d7, window, freq));
      Console.WriteLine("d1 ({0}) ~= d8 ({1}): {2}", 
                        d1, d8, RoughlyEquals(d1, d8, window, freq));
      Console.WriteLine("d1 ({0}) ~= d9 ({1}): {2}", 
                        d1, d9, RoughlyEquals(d1, d9, window, freq));
	}
}
// The example displays output similar to the following:
//    d1 (1/28/2010 9:01:26 PM) ~= d1 (1/28/2010 9:01:26 PM): True
//    d1 (1/28/2010 9:01:26 PM) ~= d2 (1/28/2010 9:01:46 PM): False
//    d1 (1/28/2010 9:01:26 PM) ~= d3 (1/28/2010 9:01:06 PM): False
//    d1 (1/28/2010 9:01:26 PM) ~= d4 (1/28/2010 9:01:31 PM): True
//    d1 (1/28/2010 9:01:26 PM) ~= d5 (1/28/2010 9:01:21 PM): True
//    d1 (1/28/2010 9:01:26 PM) ~= d6 (1/28/2010 11:01:46 PM): False
//    d1 (1/28/2010 9:01:26 PM) ~= d7 (1/28/2010 11:01:06 PM): False
//    d1 (1/28/2010 9:01:26 PM) ~= d8 (1/28/2010 11:01:31 PM): True
//    d1 (1/28/2010 9:01:26 PM) ~= d9 (1/28/2010 11:01:21 PM): True

Универсальная платформа Windows
Доступно с 8
.NET Framework
Доступно с 1.1
Переносимая библиотека классов
Поддерживается в: переносимые платформы .NET
Silverlight
Доступно с 2.0
Windows Phone Silverlight
Доступно с 7.0
Windows Phone
Доступно с 8.1

Все члены этого типа являются потокобезопасными. Элементы, используемые для изменения состояния экземпляра на самом деле возвращается новый экземпляр инициализирован с новым значением. Как с любым другим типом, чтения и записи к общей переменной, содержащий экземпляр этого типа должны быть защищены блокировкой, чтобы гарантировать потокобезопасность.

System_CAPS_cautionВнимание!

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

Вернуться в начало
Показ: