netlib.narod.ru< Назад | Оглавление | Далее >

Местное и всемирное время

Во всем мире люди думают о полудне как о времени, когда солнце находится в зените, и о полуночи — как о середине ночи. Поскольку эти два события не происходят по всему миру одновременно, люди, живущие в разных частях света, устанавливают свои часы по-разному. Некогда хаотичная, эта тенденция привела к введению четких часовых поясов, устанавливаемых государством, и рассчитываемых как часовые или получасовые смещения относительно среднего времени по Гринвичу.

Английское местечко Гринвич играет важную роль во введении стандартов времени, поскольку там расположена Королевская Гринвичская Обсерватория, основанная в 1675 г. для разработки способов астрономической навигации для кораблей, находящихся в море. В 1760-х обсерватория начала публиковать морские альманахи, в которых первый меридиан (линия долготы 0°) для удобства был принят проходящим через Гринвич. В 1884 г. эта система меридианов была принята в качестве мирового стандарта, хотя до 1911 г. французы применяли систему меридианов, согласно которой первый меридиан проходил через Париж.

В 1833 г. гринвичские астрономы начали каждый день в 13:00 запускать шар, который был виден с кораблей на Темзе. Так было основано среднее время по Гринвичу. В 1840-х это время было объявлено стандартом для всей Великобритании и заменило все различные местные значения.

Хотя люди до сих пор используют среднее время по Гринвичу в качестве мирового стандарта, применение термина всемирное скоординированное время (UTC) считается более корректным. (Всемирное скоординированное время обозначается аббревиатурой UTC в виде компромисса между порядком слов в английском (Coordinated Universal Time — CUT) и французском (Temps Universel Coordonné — TUC) языках.) Согласно международному договору от 1972 г. время UTC одинаково для всего мира.

Местное время определяется положительным или отрицательным смещением от UTC. Временные зоны к западу от Гринвича соответствуют более раннему времени, к востоку — более позднему. Так, Восточное поясное время, установленное на восточном побережье Соединенных Штатов, на 5 часов отстает от UTC. Но, прибавив ко времени UTC 19 часов, вы не получите то же значение. Такая операция даст верное время, но неправильную дату.

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

Windows позволяет установить временную зону для вашего компьютера в диалоговом окне Date/Time Properties (Свойства: Дата и время), которое можно вызвать из Панели управления или дважды щелкнув по часам на панели задач Windows. Там же можно указать, переходить ли на летнее время. Очевидно, что для каждого компьютера местное время рассчитывается как смещение от UTC, основанное на часовом поясе, в котором расположен данный компьютер, и учитывающее переход на летнее время.

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

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


Методы DateTime (выборочно)



DateTime ToLocalTime()
DateTime ToUniversalTime()


Например, если переменная dtLocal содержит местное время и дату, преобразовать значения времени и даты для UTC можно так:

  DateTime dtUtc = dtLocal.ToUniversalTime();

Если переменная dtLocal на самом деле содержала значения даты и времени для UTC, то вы получите неверный результат. Вы сами должны следить за тем, к какому часовому поясу относится ваш объект DateTime.

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


Статическое свойство TimeZone



Тип Свойство Доступ

TimeZone CurrentTimeZone Чтение


Если, например, вы вызовете

  TimeZone tz = TimeZone.CurrentTimeZone;

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


Свойства TimeZone



Тип Свойство Доступ

string StandardName Чтение/запись
string DaylightName Чтение/запись


Например, если компьютер расположен на восточном побережье США, на нем правильно установлены параметры часового пояса и вы установите переменную tz, как показано выше, свойство tz.StandardName вернет строку «Eastern Standard Time», а свойство tz.DaylightName — строку «Eastern Daylight Time».

Ниже приведены методы класса TimeZone:


Методы TimeZone



TimeSpan GetUtcOffset(DateTime dt)
DateTime ToLocalTime(DateTime dt)
DateTime ToUniversalTime(DateTime dt)
DaylightTime GetDaylightChanges(int iYear)
bool IsDaylightSavingTime(DateTime dt)
bool IsDaylightSavingTime(DateTime dt, DaylightTime dlt)


Метод GetUtcOffset возвращает разницу между местным временем и UTC в виде объекта TimeSpan. (Вскоре я опишу его подробнее. Пока же достаточно сказать, что эта структура задана в пространстве имен System и служит для выражения отрезков времени в сотнях наносекунд.) GetUtcOffset учитывает переход на летнее время. Для того же компьютера на восточном побережье США метод:

  tz.GetUtcOffset(new DateTime(2002, 2, 2))

вернет значение –5:00:00, соответствующее разнице в –5 часов. Это значение следует прибавить к UTC, чтобы получить Восточное поясное время, Вызов метода:

  tz.GetUtcOffset(new DateTime(2002, 8, 29))

вернет значение –4:00:00, или –4 часа, что объясняется переходом на летнее время.

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

Инструкция:

  DaylightTime dlt = tz.GetDaylightChanges(2002);

возвращает объект типа DaylightTime. Этот класс определен в пространстве имен System.Globalization. Он содержит три свойства:


Свойства DaylightTime



Тип Свойство Доступ

DateTime Start Чтение
DateTime End Чтение
TimeSpan Delta Чтение


Свойства Start и End показывают, что переход на летнее время имеет место 7 апреля 2002, в 2:00, а на зимнее — 27 октября 2002, в 2:00. (Оба осуществляются в воскресное утро.) Значение Delta указывает разницу во времени, равную 1 часу.

Для часовых поясов северного полушария дата, возвращаемая свойством Start, расположена в году ранее, чем дата, возвращаемая свойством End. В южном полушарии сезоны меняются местами: дата начала перехода расположена в году позднее, а конца — раньше.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz