Выполнение арифметических операций с датами и временем
DateTimeНесмотря на то, что структуры и DateTimeOffset предоставляют члены, выполняющие арифметические операции с их значениями, результаты арифметических операций сильно отличаются. В данном разделе эти различия описываются в контексте различных уровней представленности сведений о часовом поясе во временных данных, а также рассматриваются способы выполнения операций над датами и временем с полным учетом сведений о часовых поясах.
Сравнения и арифметические операции со значениями типа DateTime
DateTime.KindСвойство позволяет DateTimeKind назначить значение дате и времени, чтобы указать, представляет ли оно местное время, время в формате UTC или время в неопределенном часовом поясе. Однако эти ограниченные сведения о часовом поясе игнорируются при сравнении или выполнении арифметических операций с датами и временем для DateTimeKind значений. В следующем примере, который сравнивает текущее местное время с текущим временем в формате UTC, показано, как пропускаются сведения о часовом поясе.
Метод CompareTo(DateTime) показывает, что местное время раньше (меньше) времени в поясе UTC, а операция вычитания свидетельствует о том, что разница между временем в поясе UTC и местным временем для систем в тихоокеанском стандартном часовом поясе США составляет семь часов. Но поскольку эти два значения предоставляют различные представления одного момента времени, в этом случае ясно, что интервал времени полностью связан со смещением местного часового пояса от времени в формате UTC.
Более того DateTime.Kind , свойство не влияет на результаты, возвращаемые Kind методами сравнения и арифметическими операциями (так как сравнение двух идентичных точек во времени указывает), хотя это может повлиять на интерпретацию этих результатов. Пример:
Результат выполнения любой арифметической операции с двумя значениями даты и времени, свойства которых DateTime.Kind равны значению DateTimeKind фактического интервала времени между двумя значениями. Аналогичным образом результат сравнения двух таких значений даты и времени будет точно отражать соотношение между временами.
Результат любой операции арифметического или сравнения, выполняемый с двумя значениями даты и времени, свойства которых DateTime.Kind равны DateTimeKind или в двух значениях даты и времени с различными DateTime.Kind значениями свойств, отражает разницу в времени между двумя значениями.
Арифметические операции или операции сравнения, выполняемые над местными значениями даты и времени, не учитывают допустимость или недопустимость конкретных значений; не учитывают они и какие-либо правила коррекции, необходимые при переводе местного часового пояса на зимнее или летнее время.
В результат любой операции, сравнивающей или вычисляющей разницу между временем в формате UTC и местным временем, входит временной интервал, равный смещению местного часового пояса относительно времени в формате UTC.
Любая операция, которая сравнивает или вычисляет разницу между неуказанным временем и временем в формате UTC или местным временем, соответствует простому времени. Различия между часовыми поясами не учитываются, и в результате не отражено применение правил коррекции часовых поясов.
Любая операция, которая сравнивает или вычисляет разницу между двумя неуказанными значениями времени, может включать неизвестный интервал, который отражает временную разницу между двумя различными часовыми поясами.
Существует множество ситуаций, в которых различия часовых поясов не влияют на вычисления даты и времени (в некоторых случаях их описание см. в разделе Выбор между DateTime, DateTimeOffset, TimeSpan и TimeZoneInfo) или в контексте данных даты и времени определяет значение операций сравнения или арифметической операции.
Сравнения и арифметические операции со значениями DateTimeOffset
DateTimeOffsetЗначение включает не только дату и время, но и смещение, которое однозначно определяет эту дату и время относительно времени в формате UTC. Это смещение позволяет определить равенство иначе, чем для DateTime значений. DateTimeВ то время как значения равны, если они имеют одинаковые значения даты и времени, DateTimeOffset значения равны, если они ссылаются на один и тот же момент времени. При использовании в сравнениях и в большинстве арифметических операций, определяющих интервал между двумя датами и временем, DateTimeOffset значение является более точным и меньшим при необходимости интерпретации. В следующем примере, который является аналогом предыдущего примера, сравниваемого с локальным и UTC DateTimeOffset - DateTimeOffset значениями, показано различие в поведении.
В этом примере CompareTo метод указывает, что текущее местное время и текущее время в формате UTC равны, а вычитание CompareTo(DateTimeOffset) значений указывает, что разница между двумя значениями времени TimeSpan.Zero равна.
Главным ограничением использования значений в арифметических операциях с DateTimeOffset датами и временем является то, что хотя DateTimeOffset значения имеют определенные Часовые пояса, они не поддерживают полную поддержку часовых поясов. DateTimeOffsetХотя смещение значения отражает смещение часового пояса от времени в формате UTC, когда DateTimeOffset переменной сначала присваивается значение, она становится несвязанной с часовым поясом впоследствии. Поскольку оно больше не связано напрямую с распознаваемым временем, правила коррекции часовых поясов больше не будут учитываться при сложении и вычитании интервалов даты и времени.
Пример: переход на летнее время в зоне центрального стандартного времени США произошел в 02:00 9 марта 2008 года. Учитывая это, добавление двух и половинного интервала к центральному стандартному времени 1:30 утра 9 марта 2008 года должно привести к дате и времени, равным 5:00 утра 9 марта 2008 г. Однако, как показано в следующем примере, результатом сложения является 04:00 9 марта 2008 года. Результат этой операции представляет нужный момент времени, хотя это не время в часовом поясе, в котором мы заинтересованы (то есть у него нет ожидаемого смещения часового пояса).
Арифметические операции со временем в часовых поясах
TimeZoneInfoКласс включает методы преобразования, которые автоматически применяют корректировки при преобразовании времени из одного часового пояса в другой. Эти методы преобразования включают:
ConvertTimeМетоды и ConvertTimeBySystemTimeZoneId , которые преобразуют время между любыми двумя часовыми поясами.
ConvertTimeFromUtcМетоды и ConvertTimeToUtc , которые преобразуют время в определенном часовом поясе в формате UTC или преобразуют время в формате UTC в определенный часовой пояс.
TimeZoneInfoКласс не предоставляет методы, которые автоматически применяют правила коррекции при выполнении арифметических действий с датами и временем. Однако можно применить правила коррекции, преобразовав время в часовом поясе в формате UTC, выполнив арифметическую операцию, а затем преобразуя время UTC обратно к времени в часовом поясе. Дополнительные сведения см. в разделе как использовать Часовые пояса в арифметических действиях с датами и временем.
Например, следующий код аналогичен предыдущему коду, в котором 2,5 часа добавлялись к 02:00 9 марта 2008 года. Тем не менее, поскольку в этом примере перед выполнением арифметических действий над датой и временем центральное стандартное время преобразуется во время в формате UTC, а затем результат преобразуется из времени UTC обратно в центральное стандартное время, полученное время соответствует переходу центрального стандартного часового пояса на летнее время.