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

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 года значения (нашей эры) до 11: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
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) culture метод, чтобы отобразить полный шаблон даты и времени для 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 дней года в двадцать первом веке. Выходные данные представляет результат, если пример выполняется в системе с региональными является английский (Великобритания). Поскольку мы десериализовать 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

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

Если круговой путь проходит только время, например 3 P.M., конечная дата и время — 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

Universal Windows Platform
Доступно с 8
.NET Framework
Доступно с 1.1
Portable Class Library
Поддерживается в версиях: portable .NET platforms
Silverlight
Доступно с 2.0
Windows Phone Silverlight
Доступно с 7.0
Windows Phone
Доступно с 8.1

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

System_CAPS_cautionВнимание

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

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