Содержание
Для работы с датой и временем в пространстве имен System предусмотрено три неизменяемых структуры: DateTime, DateTimeOffset и TimeSpan.
TimeSpan
Структура TimeSpan представляет временной интервал или время суток. В последнем случае это время (без даты) прошедшее с полуночи (без учет переходов на летнее время). Минимально значение для TimeSpan — 100 наносекунд, максимальное — примерно 10 миллионов дней (значение может быть и положительным, и отрицательным).
Создать экземпляр TimeSpan можно с помощью конструктора, вызвав один из статических методов From..., либо путем вычитания одного экземпляра DateTime из другого.
Предусмотрено 4 перегруженных конструктора:
1 2 3 4 | public TimeSpan (int hours, int minutes, int seconds); public TimeSpan (int days, int hours, int minutes, int seconds); public TimeSpan (int days, int hours, int minutes, int seconds, int milliseconds); public TimeSpan (long ticks); // Каждый tick = 100ns |
Статические методы From... более удобны когда нужно указать интервал в каких-то одних единицах (минутах, секундах):
1 2 3 4 5 | public static TimeSpan FromDays (double value); public static TimeSpan FromHours (double value); public static TimeSpan FromMinutes (double value); public static TimeSpan FromSeconds (double value); public static TimeSpan FromMilliseconds (double value); |
Пример:
1 2 3 | Console.WriteLine (new TimeSpan (2, 30, 0)); // 02:30:00 Console.WriteLine (TimeSpan.FromHours (2.5)); // 02:30:00 Console.WriteLine (TimeSpan.FromHours (−2.5)); // −02:30:00 |
TimeSpan перегружает операторы <, >, + и -:
1 2 | TimeSpan.FromHours(2) + TimeSpan.FromMinutes(30); // 2,5 часа TimeSpan.FromDays(10) - TimeSpan.FromSeconds(1); // 9.23:59:59 |
TimeSpan содержит свойства Days, Hours, Minutes, Seconds и Milliseconds, возвращающие соответствующие целочисленные значения, а также аналогичные свойства Total..., возвращающие значения типа double:
1 2 3 4 5 6 7 8 9 10 11 | TimeSpan nearlyTenDays = TimeSpan.FromDays(10) - TimeSpan.FromSeconds(1); Console.WriteLine (nearlyTenDays.Days); // 9 Console.WriteLine (nearlyTenDays.Hours); // 23 Console.WriteLine (nearlyTenDays.Minutes); // 59 Console.WriteLine (nearlyTenDays.Seconds); // 59 Console.WriteLine (nearlyTenDays.Milliseconds); // 0 Console.WriteLine (nearlyTenDays.TotalDays); // 9.99998842592593 Console.WriteLine (nearlyTenDays.TotalHours); // 239.999722222222 Console.WriteLine (nearlyTenDays.TotalMinutes); // 14399.9833333333 Console.WriteLine (nearlyTenDays.TotalSeconds); // 863999 Console.WriteLine (nearlyTenDays.TotalMilliseconds); // 863999000 |
Статический метод Parse является противоположностью ToString, преобразуя строку в TimeSpan. Метод TryParse делает тоже самое, но в случае неудачи возвращает false вместо генерации исключения.
Значением по умолчанию для TimeSpan является TimeSpan.Zero.
DateTime и DateTimeOffset
DateTime и DateTimeOffset — это неизменяемые структуры для представления даты и времени. Поддерживаемый диапазон лет — от 0001 до 9999, а минимальный шаг (tick) — 100 наносекунд.
Структуры отличаются по своему внутреннему строению и тем, как они обрабатывают часовые пояса. DateTime состоит из двух порций информации:
- 62-битное число, указывающее количество
tick, прошедшее с 1/1/001 - 2-битное значение
enum— флагDateTimeKindс тремя состояниями, который указывает, относительно чего беретсяDateTime:Local— местное время на текущем компьютереUtc— UTC (современный эквивалент Гринвича)Unspecified— не определено — принимается по умолчанию и означает, чтоDateTimeне зависит от часового пояса
Таким образом экземпляр DateTime не содержит информации о конкретном часовом поясе и не хранит числовое смещение UTC. Во время сравнения DateTime сравнивает только значения ticks, игнорируя флаг с тремя состояниями и считает, что два значения равны, если они имеют одинаковый год, месяц, день, часы, минуты и т.д.
Структура DateTimeOffset внутри содержит:
- поле
DateTime, значение которого всегда представлено относительно UTC - 16-битное целочисленное поле
Offset(типTimeSpan), выражающее смещение относительно UTC в минутах
Во время сравнения DateTimeOffset сравнивает только поле DateTime (которое в UTC), Offset игнорируется. Таким образом DateTimeOffset считает два значения равными, если они ссылаются на одну и туже точку во времени.
Исходя из этого, DateTime считает следующие два значения различными, а DateTimeOffset — равными:
1 2 | July 01 2007 09:00:00 +00:00 July 01 2007 03:00:00 −06:00 |
Создание экземпляра DateTime
DateTime определяет два конструктора, которые принимают целочисленные значения для года, месяца и дня, а также дополнительно — для часов, минут, секунд и миллисекунд:
1 2 3 | public DateTime (int year, int month, int day); public DateTime (int year, int month, int day, int hour, int minute, int second, int millisecond); |
Если указывается только дата, время неявно устанавливается в полночь (0:00). Также конструктор DateTime позволяет задать указанный выше флаг DateTimeKind:
1 2 | DateTime dt1 = new DateTime (2000, 1, 1, 10, 20, 30, DateTimeKind.Local); DateTime dt2 = new DateTime (2000, 1, 1, 10, 20, 30, DateTimeKind.Utc); |
Перегруженный конструктор DateTime может принимать объект Calendar (System.Globalization), позволяя задать используемый календарь:
1 2 3 | DateTime d = new DateTime (5767, 1, 1, new System.Globalization.HebrewCalendar()); Console.WriteLine (d); // 12/12/2006 12:00:00 AM |
По умолчанию используется григорианский календарь. Для выполнения вычислений с использованием другого календаря необходимо использовать соответствующие методы подкласс Calendar.
Создать экземпляр DateTime можно также передав конструктору единственный параметр ticks типа long, соответствующий количеству 100-наносекундных интервалов, прошедших от полуночи 01/01/0001.
Экземпляр DateTime можно создать с помощью статических методов FromFileTime и FromFileTimeUtc, преобразующих время файлов Windows (тип long), а также с помощью статического метода FromOADate, преобразующего даты и время автоматизации OLE (тип double).
С помощью статического метода SpecifyKind можно создать экземпляр DateTime, который будет отличаться от другого только значением DateTimeKind:
1 2 3 | DateTime d = new DateTime (2000, 12, 12); // Unspecified DateTime utc = DateTime.SpecifyKind (d, DateTimeKind.Utc); Console.WriteLine (utc); // 12/12/2000 12:00:00 AM |
Для создания объекта DateTime из строки нужно воспользоваться статическим методом Parse или ParseExact. Оба метода могут дополнительно принимать флаги и поставщики форматов, а ParseExact также может принимать форматную строку.
Создание экземпляра DateTimeOffset
DateTimeOffset имеет похожий набор конструкторов, но им обязательно также нужно передавать смещение UTC в виде TimeSpan:
1 2 3 4 5 6 | public DateTimeOffset (int year, int month, int day, int hour, int minute, int second, TimeSpan offset); public DateTimeOffset (int year, int month, int day, int hour, int minute, int second, int millisecond, TimeSpan offset); |
Значение TimeSpan должно составлять целое количество минут, иначе будет выброшено исключение.
DateTimeOffset также имеет конструкторы, которые принимают объект Calendar, значение ticks типа long, а также статические методы Parse и ParseExact, принимающие строку.
Экземпляр DateTimeOffset можно также создать из существующего экземпляра DateTime либо с помощью конструктора, либо с помощью неявного приведения:
1 2 3 | public DateTimeOffset (DateTime dateTime); public DateTimeOffset (DateTime dateTime, TimeSpan offset); DateTimeOffset dt = new DateTime (2000, 2, 3); |
Если смещение не указано, он выводится автоматически по следующим правилам:
- если свойство
DateTimeKindобъектаDateTimeравноUtc, смещение принимается равным нулю - если свойство
DateTimeKindобъектаDateTimeравноLocalилиUnspecified(по умолчанию), смещение берется из текущего часового пояса
DateTimeOffset также может быть преобразован в DateTime с помощью одного из трех свойств:
UtcDateTimeвозвращает экземплярDateTimeкак время UTC (без смещения)LocalDateTimeвозвращает экземплярDateTimeв текущем часовом поясеDateTimeвозвращает экземплярDateTimeв часовом поясе, переданном в качестве аргумента (свойствоKindустанавливается равнымUnspecified)
Текущая дата и время
Обе структуры имеют статические свойство Now, которое возвращает текущую дату и время:
1 2 | Console.WriteLine (DateTime.Now); // 11/11/2014 1:23:45 PM Console.WriteLine (DateTimeOffset.Now); // 11/11/2014 1:23:45 PM +03:00 |
Статическое свойство UtcNow возвращает текущую дату и время в UTC:
1 2 | Console.WriteLine (DateTime.UtcNow); // 11/11/2007 7:23:45 AM Console.WriteLine (DateTimeOffset.UtcNow); // 11/11/2007 7:23:45 AM +00:00 |
DateTime содержит также статическое свойство Today, возвращающее текущую дату (без времени):
1 | Console.WriteLine (DateTime.Today); // 11/11/2014 12:00:00 AM |
Манипулирование датой и временем
Обе структуры имеют схожий набор свойств, возвращающих элементы даты и времени:
1 2 3 4 5 6 7 8 9 10 11 12 | DateTime dt = new DateTime (2000, 2, 3, 10, 20, 30); Console.WriteLine (dt.Year); // 2000 Console.WriteLine (dt.Month); // 2 Console.WriteLine (dt.Day); // 3 Console.WriteLine (dt.DayOfWeek); // Thursday Console.WriteLine (dt.DayOfYear); // 34 Console.WriteLine (dt.Hour); // 10 Console.WriteLine (dt.Minute); // 20 Console.WriteLine (dt.Second); // 30 Console.WriteLine (dt.Millisecond); // 0 Console.WriteLine (dt.Ticks); // 630851700300000000 Console.WriteLine (dt.TimeOfDay); // 10:20:30 (TimeSpan) |
DateTimeOffset также содержит свойство Offset, возвращающее TimeSpan, а DateTime — свойство Kind, возвращающее значение DateTimeKind.
Обе структуры содержат ряд методов для выполнения вычислений (большинство принимают аргументы типа double или int):
AddYearsAddMonthsAddDaysAddHoursAddMinutesAddSecondsAddMillisecondsAddTicks
Эти методы возвращают новый экземпляр DateTime или DateTimeOffset и учитывают високосный год. Для вычитания можно передавать отрицательное значение.
Метод Add добавляет TimeSpan к DateTime или DateTimeOffset. Оператор + выполняет тоже самое:
1 2 3 | TimeSpan ts = TimeSpan.FromMinutes (90); Console.WriteLine (dt.Add (ts)); Console.WriteLine (dt + ts); |
Можно также вычитать TimeSpan из DateTime/DateTimeOffset и вычитать один экземпляр
DateTime/DateTimeOffset из другого, в последнем случае будет возвращен TimeSpan:
1 2 3 | DateTime thisYear = new DateTime (2007, 1, 1); DateTime nextYear = thisYear.AddYears (1); TimeSpan oneYear = nextYear - thisYear; |
Форматирование даты и времени
Вызов ToString на объекте DateTime форматирует результат в виде краткой даты (только числа), за которой следует полное время (включая секунды):
1 | 13/02/2000 11:50:30 AM |
По умолчанию панель управления ОС определяет такие вещи, как порядок следования даты, месяца и года, должны ли использоваться ведущие нули, формат времени (12 или 24 часа) и др.
Вызов ToString на объекте DateTimeOffset делает тоже самое, но добавляет еще и смещение:
1 | 3/02/2000 11:50:30 AM −06:00 |
Методы ToShortDateString и ToLongDateString возвращают только дату в коротком или длинном формате. Формат длинной даты также определяется в панели управления. Методы ToShortTimeString и ToLongTimeString возвращают только время (ToShortTimeString без секунд).
Метод ToString перегружен для приема форматной строки и поставщиков, позволяя указывать широкий диапазон опций и управлять применением региональных настроек.
ToUniversalTime и ToLocalTime
Экземплярные методы ToUniversalTime и ToLocalTime структуры DateTime выполняют преобразование в универсальное (UTC) или местное время. Они применяют текущие настройки часового пояса компьютера и возвращают новый экземпляр DateTime со значением DateTimeKind, равным Utc или Local:
1 2 3 4 5 6 | DateTime dt1 = new DateTime (2000, 1, 1, 10, 20, 30, DateTimeKind.Local); DateTime dt2 = new DateTime (2000, 1, 1, 10, 20, 30, DateTimeKind.Utc); Console.WriteLine (dt1 == dt2); // True DateTime local = DateTime.Now; DateTime utc = local.ToUniversalTime(); Console.WriteLine (local == utc); // False |
Экземплярные методы ToUniversalTime и ToLocalTime структуры DateTimeOffset возвращают новый экземпляр, представляющий тот же самый момент времени, но в UTC или местном времени. В отличие от аналогичных методов DateTime, эти методы не оказывают влияния на лежащее в основе значение даты и времени, а изменяют только смещение:
1 2 3 4 5 | DateTimeOffset local = DateTimeOffset.Now; DateTimeOffset utc = local.ToUniversalTime(); Console.WriteLine (local.Offset); // +03:00:00 Console.WriteLine (utc.Offset); // 00:00:00 Console.WriteLine (local == utc); // True |
С помощью метода EqualsExact можно включить в сравнение поле Offset:
1 | Console.WriteLine (local.EqualsExact (utc)); // False |
TimeZone и TimeZoneInfo
Классы TimeZone и TimeZoneInfo предоставляют информацию, касающуюся названий часовых поясов, смещений UTC и правил перехода на зимнее время. TimeZone позволяет обратиться только к текущему местному часовому поясу, а TimeZoneInfo обеспечивает доступ к часовым поясам во всем мире.
TimeZone
Статический метод TimeZone.CurrentTimeZone возвращает экземпляр TimeZone на основе текущих местных настроек:
1 2 3 | TimeZone zone = TimeZone.CurrentTimeZone; Console.WriteLine (zone.StandardName); // W. Australia Standard Time Console.WriteLine (zone.DaylightName); // W. Australia Daylight Time |
Метод IsDaylightSavingTime возвращает true, если переданный ему объект DateTime относится к зимнему времени, и false — если к летнему:
1 2 3 4 | DateTime dt1 = new DateTime (2008, 1, 1); DateTime dt2 = new DateTime (2008, 6, 1); Console.WriteLine (zone.IsDaylightSavingTime (dt1)); // True Console.WriteLine (zone.IsDaylightSavingTime (dt2)); // False |
Метод GetUtcOffset возвращает смещение относительно UTC для переданного ему объекта DateTime:
1 2 | Console.WriteLine (zone.GetUtcOffset (dt1)); // 09:00:00 Console.WriteLine (zone.GetUtcOffset (dt2)); // 08:00:00 |
Метод GetDaylightChanges возвращает специфическую информацию о зимнем времени для заданного года:
1 2 3 4 | DaylightTime day = zone.GetDaylightChanges (2008); Console.WriteLine (day.Start); // 26/10/2008 2:00:00 AM (Note D/M/Y) Console.WriteLine (day.End); // 30/03/2008 3:00:00 AM Console.WriteLine (day.Delta); // 01:00:00 |
TimeZoneInfo
Класс TimeZoneInfo работает аналогичным образом. Статический класс TimeZoneInfo.Local возвращает экземпляр TimeZoneInfo для текущего местного часового пояса:
1 2 3 | TimeZoneInfo zone = TimeZoneInfo.Local; Console.WriteLine (zone.StandardName); // W. Australia Standard Time Console.WriteLine (zone.DaylightName); // W. Australia Daylight Time |
Класс TimeZoneInfo также содержит методы IsDaylightSavingTime и GetUtcOffset, но в отличие от одноименных методов класс TimeZone они могут принимать как объекты типа DateTime так и объекты DateTimeOffset.
Вызвав метод FindSystemTimeZoneById с идентификатором часового пояса (Id), можно получить объект TimeZoneInfo для любого часового пояса в мире.
1 2 3 4 5 | TimeZoneInfo wa = TimeZoneInfo.FindSystemTimeZoneById ("W. Australia Standard Time"); Console.WriteLine (wa.Id); // W. Australia Standard Time Console.WriteLine (wa.DisplayName); // (GMT+08:00) Perth Console.WriteLine (wa.BaseUtcOffset); // 08:00:00 Console.WriteLine (wa.SupportsDaylightSavingTime); // True |
Свойство Id соответствует значению передаваемому методу FindSystemTimeZoneById. Статический метод GetSystemTimeZones возвращает все часовые пояса мира, соответственно можно вывести список всех доступных Id часовых поясов:
1 2 | foreach (TimeZoneInfo z in TimeZoneInfo.GetSystemTimeZones()) Console.WriteLine (z.Id); |
С помощью статического метода TimeZoneInfo.CreateCustomTimeZone можно создать свой специфический часовой пояс, передав методу все данные о часовом поясе. После создания экземпляра изменить его свойства уже нельзя, т.к. TimeZoneInfo является неизменяемым.
С помощью экземплярного метода ToSerializedString можно сериализовать часовой пояс в читабельную строку, а с помощью статического метода TimeZoneInfo.FromSerializedString — десериализовать ее.
Статический метод ConvertTime преобразует DateTime или DateTimeOffset из одного часового пояса в другой, а методы ConvertTimeFromUtc и ConvertTimeToUtc преобразуют непосредственно в или из UTC.
Для работы с зимнем временем класс TimeZoneInfo предлагает следующие методы:
IsInvalidTime— возвращаетtrue, еслиDateTimeнаходится в пределах часа, который будет пропущен, когда часы переводятся впередIsAmbiguousTime— возвращаетtrue, еслиDateTimeилиDateTimeOffsetнаходится в пределах часа, который будет повторен, когда часы переводятся назадGetAmbiguousTimeOffsets— возвращает массив изTimeSpan, представляющий допустимые варианты смещения дляDateTimeилиDateTimeOffset, находящихся в пределах часа, повторяющегося при переводе часов назад.
В отличие от TimeZone, из TimeZoneInfo нельзя получить напрямую даты, указывающие начало и конец зимнего времени. Вместо этого нужно вызывать метод GetAdjustmentRules, который возвращает список правил перехода на зимнее время, применяемых ко всем годам. Каждое правило — объект типа TimeZoneInfo.AdjustmentRule — имеет свойства DateStart и DateEnd, указывающие диапазон дат, в пределах которого это правило допустимо:
1 2 | foreach (TimeZoneInfo.AdjustmentRule rule in wa.GetAdjustmentRules()) Console.WriteLine ("Rule: applies from " + rule.DateStart + " to " + rule.DateEnd); |
Например в западной Австралии переход на зимнее время впервые был введен в 2006 г. в межсезонье, поэтому для первого года будет отдельное правило, а всего их будет два:
1 2 | Rule: applies from 1/01/2006 12:00:00 AM to 31/12/2006 12:00:00 AM Rule: applies from 1/01/2007 12:00:00 AM to 31/12/2009 12:00:00 AM |
Каждый экземпляр TimeZoneInfo.AdjustmentRule имеет свойство DaylightDelta типа TimeSpan — время, необходимое для перехода на зимнее время в данном часовом поясе (смещение для зимнего времени), как правило это один час.
Также AdjustmentRule содержит свойства DaylightTransitionStart и DaylightTransitionEnd, возвращающие тип TimeZoneInfo.TransitionTime, включающий следующие свойства:
1 2 3 4 5 6 | public bool IsFixedDateRule { get; } // true если дата фиксированная, false - плавающая public DayOfWeek DayOfWeek { get; } // только для плавающей даты public int Week { get; } // только для плавающей даты public int Day { get; } // только для фиксированной даты public int Month { get; } public DateTime TimeOfDay { get; } |
Правило может выражать как фиксированную дату (например, 5 марта 2:00), так и плавающую (например, последнее воскресенье марта). Свойство IsFixedDateRule возвращает true если дата фиксированная, и fasle если дата плавающая. Фиксированная дата задается свойствами Day, Month и TimeOfDay, а плавающая — DayOfWeek, Week, Month и TimeOfDay.
Преобразование даты в строку
Объекты DateTime и DateTimeOffset могут быть преобразованы в строку с помощью экземплярного метода ToString. В качестве дополнительного параметра метод может принимать форматные строки. Подробно этот метод и форматные строки рассмотрены в разделе, посвященном форматированию и преобразованию строк. Ниже будут перечислены стандартные и специальные форматные строки для типов DateTime и DateTimeOffset.
Стандартные форматные строки для даты, чувствительные к культуре
| Форматная строка | Значение | Пример |
|---|---|---|
| d | Краткая дата | 01/02/2000 |
| D | Полная дата | Sunday, 02 January 2000 |
| t | Краткое время | 17:18 |
| T | Полное время | 17:18:19 |
| f | Полная дата+краткое время | Sunday, 02 January 2000 17:18 |
| F | Полная дата+полное время | Sunday, 02 January 2000 17:18:19 |
| g | Краткая дата+краткое время | 01/02/2000 17:18 |
| G (по умолчанию) | Краткая дата+полное время | 01/02/2000 17:18:19 |
| m, M | Месяц и день | January 02 |
| y, Y | Год и месяц | 2000 January |
Стандартные форматные строки для даты, не чувствительные к культуре
| Форматная строка | Значение | Пример | Примечание |
|---|---|---|---|
| o | Возможность кругового преобразования | 2000-01-02T17:18:19.0000000 | Если DateTimeKind не является Unspecified, будет присоединяться информация о часовом поясе |
| r, R | Стандарт RFC 1123 | Sun, 02 Jan 2000 17:18:19 GMT | Не преобразованное в UTC |
| s | Сортируемое, ISO 8601 | 2000-01-02T17:18:19 | Совместимо с текстовой сортировкой |
| u | Универсально сортируемое | 2000-01-02 17:18:19Z | Совместимо с текстовой сортировкой, не преобразованное в UTC |
| U | UTC | Sunday, 02 January 2000 17:18:19 | Преобразованная в UTC |
Специальные форматные строки для даты и времени
| Символ | Описание | Пример |
|---|---|---|
| d | День месяца в виде числа (1-31), одна цифра не дополняется нулем | 6/1/2009 1:45:30 PM -> 1 6/15/2009 1:45:30 PM -> 15 |
| dd | День месяца в виде числа (01-31), одна цифра дополняется нулем | 6/1/2009 1:45:30 PM -> 01 6/15/2009 1:45:30 PM -> 15 |
| ddd | Сокращенное название дня недели | 6/15/2009 1:45:30 PM -> Mon (en-US) 6/15/2009 1:45:30 PM -> Пн (ru-RU) 6/15/2009 1:45:30 PM -> lun. (fr-FR) |
| dddd | Полное название дня недели | 6/15/2009 1:45:30 PM -> Monday (en-US) 6/15/2009 1:45:30 PM -> понедельник (ru-RU) 6/15/2009 1:45:30 PM -> lundi (fr-FR) |
| f — fffffff | Десятые — десятимиллионные доли секунды | 6/15/2009 13:45:30.617 -> 6 (f) 6/15/2009 13:45:30.0001150 -> 0001150 (fffffff) |
| F — FFFFFFF | Тоже самое, что и предыдущее, но если соотвествующее значение равно 0, то не выводится ничего | 6/15/2009 13:45:30.617 -> 6 6/15/2009 13:45:30.050 -> (нет вывода) |
| g, gg | Период или эра | 6/15/2009 1:45:30 PM -> A.D. |
| h | Час в 12-часовом формате от 1 до 12 | 6/15/2009 1:45:30 AM -> 1 6/15/2009 1:45:30 PM -> 1 |
| hh | Час в 12-часовом формате от 01 до 12 | 6/15/2009 1:45:30 AM -> 01 6/15/2009 1:45:30 PM -> 01 |
| H | Час в 24-часовом формате от 0 до 23 | 6/15/2009 1:45:30 AM -> 1 6/15/2009 1:45:30 PM -> 13 |
| HH | Час в 24-часовом формате от 00 до 23 | 6/15/2009 1:45:30 AM -> 01 6/15/2009 1:45:30 PM -> 13 |
| K | Данные о часовом поясе | Со значениями DateTime: 6/15/2009 1:45:30 PM, Kind Unspecified -> 6/15/2009 1:45:30 PM, Kind Utc -> Z 6/15/2009 1:45:30 PM, Kind Local -> -07:00 (зависит от настроек локального компьютера) Со значениями DateTimeOffset: 6/15/2009 1:45:30 AM -07:00 —> -07:00 6/15/2009 8:45:30 AM +00:00 —> +00:00 |
| m | Минуты, в диапазоне от 0 до 59 | 6/15/2009 1:09:30 AM -> 9 |
| mm | Минуты, в диапазоне от 00 до 59 | 6/15/2009 1:09:30 AM -> 09 |
| M | Месяц, в диапазоне от 1 до 12 | 6/15/2009 1:45:30 PM -> 6 |
| MM | Месяц, в диапазоне от 01 до 12 | 6/15/2009 1:45:30 PM -> 06 |
| MMM | Сокращенное название месяца | 6/15/2009 1:45:30 PM -> Jun (en-US) |
| MMMM | Полное название месяца | 6/15/2009 1:45:30 PM -> June (en-US) |
| s | Секунды, в диапазоне от 0 до 59 | 6/15/2009 1:45:09 PM -> 9 |
| ss | Секунды, в диапазоне от 00 до 59 | 6/15/2009 1:45:09 PM -> 09 |
| t | Первый символ указателя AM/PM | 6/15/2009 1:45:30 PM -> P (en-US) 6/15/2009 1:45:30 PM -> (fr-FR) |
| tt | Указатель AM/PM | 6/15/2009 1:45:30 PM -> PM (en-US) 6/15/2009 1:45:30 PM -> (fr-FR) |
| y | Год, в диапазоне от 0 до 99 | 1/1/1900 12:00:00 AM -> 0 6/15/2009 1:45:30 PM -> 9 |
| yy | Год, в диапазоне от 00 до 99 | 1/1/1900 12:00:00 AM -> 00 6/15/2009 1:45:30 PM -> 09 |
| yyy | Год в виде как минимум трех цифр | 1/1/0001 12:00:00 AM -> 001 6/15/2009 1:45:30 PM -> 2009 |
| yyyy | Год в виде четырехзначного числа | 1/1/0001 12:00:00 AM -> 0001 6/15/2009 1:45:30 PM -> 2009 |
| yyyyy | Год в виде пятизначного числа | 1/1/0001 12:00:00 AM -> 00001 6/15/2009 1:45:30 PM -> 02009 |
| z | Часовой сдвиг от времени в формате UTC, без нулей в начале | 6/15/2009 1:45:30 PM -07:00 -> -7 |
| zz | Часовой сдвиг от времени в формате UTC с нулями в начале для значений из одной цифры | 6/15/2009 1:45:30 PM -07:00 -> -07 |
| zzz | Сдвиг в часах и минутах от времени в формате UTC | 6/15/2009 1:45:30 PM -07:00 -> -07:00 |
| : | Разделитель компонентов времени | 6/15/2009 1:45:30 PM -> : (en-US) 6/15/2009 1:45:30 PM -> . (it-IT) |
| / | Разделитель компонентов даты | 6/15/2009 1:45:30 PM -> / (en-US) 6/15/2009 1:45:30 PM -> — (ar-DZ) 6/15/2009 1:45:30 PM -> . (tr-TR) |
| % | Задает следующий символ в качестве настраиваемого описателя формата | 6/15/2009 1:45:30 PM (%h) -> 1 |
| \ | Экранирующий символ | 6/15/2009 1:45:30 PM (h \h) -> 1 h |
| любой другой символ | Символ копируется в результирующую строку без изменений | 6/15/2009 1:45:30 AM (arr hh:mm t) -> arr 01:45 A |
| строка с любыми символами в (двойных/одинарных) кавычках | Буквенный разделитель строк | 6/15/2009 1:45:30 PM («arr:» h:m t) -> arr: 1:45 P 6/15/2009 1:45:30 PM (‘arr:’ h:m t) -> arr: 1:45 P |
Преобразование строки в дату/время, DateTimeStyles
Преобразование строки в объекты DateTime или DateTimeOffset можно осуществить с помощью статических методов Parse и TryParse. Подробно эти методы рассмотрены в разделе, посвященном форматированию и преобразованию строк.
Оба метода могут принимать enum DateTimeStyles, определяющий как строка читается при преобразовании в тип даты и времени. Его членами являются:
None— стандартное значение, запрещает наличие во входной строке дополнительных пробельных символовAllowLeadingWhite— допускает в начале входной строки дополнительные пробелыAllowTrailingWhite— допускает в конце входной строки дополнительные пробелыAllowInnerWhite— допускает внутри входной строки дополнительные пробелыAssumeLocal— если входная строка не имеет суффикса часового пояса, дает указание использовать локальное значениеAssumeUniversalесли входная строка не имеет суффикса часового пояса, дает указание использовать UTCAdjustToUniversal— учитывает суффиксы часовых поясов во входной строке, но затем выполняет преобразование в UTC с использованием текущих региональных настроекNoCurrentDateDefault— при разборе строки, содержащей время без даты, по умолчанию принимается сегодняшняя дата, но данный флаг дает указание в качестве даты использовать 01/01/0001RoundTripKindAllowWhiteSpaces— составной член, равенAllowLeadingWhite | AllowTrailingWhite | AllowInnerWhite

