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

Число отсчетов

Еще один способ представления даты и времени — указать количество временных отсчетов длительностью 100 наносекунд. Внутри структуры DateTime дата и время хранятся в виде числа таких отсчетов, прошедших с полуночи 1 января 1 года нашей эры. Два оставшихся свойства DateTime возвращают это значение и число таких отсчетов, прошедших с полуночи:


Свойства DateTime (выборочно)



Тип Свойство Доступ Описание

long Ticks Чтение Число отсчетов по 100 наносекунд, прошедших с 1.1.0001
TimeSpan TimeOfDay Чтение Число отсчетов по 100 наносекунд, прошедших с полуночи


Помните: значение типа long имеет размер 64 бита и поэтому может хранить очень большие значения, что, безусловно, требуется в данном случае. Заметьте, что свойство TimeOfDay возвращает объект типа TimeSpan, выражающий отрезки времени в сотнях наносекунд.

Для 1 января 2001 г. свойство Ticks возвращает значение 631 139 040 000 000 000. В миллисекунде содержится 10 000 таких отсчетов, в секунде — 10 000 000, в минуте — 600 000 000, в часе — 36 000 000 000, а за один день их проходит 864 000 000 000. (Кстати, все эти константы доступны как поля структуры TimeSpan.) Это значит, что за эти 2 000 лет прошло 730 485 дней, что в среднем составляет 365,2425 дней в году.

Для Григорианского календаря 365,2425 дней в году — верное значение: большинство годов длится 365 дней. Дополнительный день каждые четыре года прибавляет 0,25 к среднему значению дней в года. Вычитание дополнительного дня каждые 100 лет уменьшает это значение на 0,01. Дополнительный день каждые 400 лет увеличивает его на 0,0025. Другими словами:

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


Конструкторы DateTime (выборочно)



DateTime(long ticks)


Объекты TimeSpan можно создавать подобным образом или явно указывая дни и время. Вот полный список конструкторов TimeSpan:


Конструкторы TimeSpan



TimeSpan(long ticks)
TimeSpan(int hours, int minutes, int seconds)
TimeSpan(int days, int hours, int minutes, int seconds)
TimeSpan(int days, int hours, int minutes, int seconds, int milliseconds)


Конструкторы DateTime и TimeSpan очень похожи, поэтому важно понимать разницу между ними. Объект DateTime соответствует конкретному значению даты и времени; свойство Ticks объекта DateTime возвращает количество временных отсчетов по 100 наносекунд, прошедших с 1 января 1 года нашей эры.

Объект TimeSpan соответствует длительности, т.е. периоду прошедшего времени. Заметьте: аргументы конструкторов TimeSpan не указывают какой либо конкретный день, час, минуту, секунду и миллисекунду. Они соответствуют определенному числу дней и числу часов и т.д. В конструкторах TimeSpan не используются месяцы и годы, поскольку в разных месяцах и годах разное количество дней.

На значения, которые могут быть переданы в качестве аргументов конструкторам TimeSpan в отличие от конструкторов DateTime ограничения не накладываются. Так, инструкция:

  TimeSpan ts = new TimeSpan(1000, 1000, 1000, 1000, 1000);

абсолютно корректна.

Вот полный список свойств объектов TimeSpan.


Свойства TimeSpan



Тип Свойство Доступ Описание

long Ticks Чтение Число интервалов по 100 наносекунд
int Days Чтение Целое число дней
int Hours Чтение от 0 до 23
int Minutes Чтение от 0 до 59
int Seconds Чтение от 0 до 59
int Milliseconds Чтение от 0 до 999
double TotalDays Чтение = (double) Ticks / TicksPerDay
double TotalHours Чтение = (double) Ticks / TicksPerHour
double TotalMinutes Чтение = (double) Ticks / TicksPerMinute
double TotalSeconds Чтение = (double) Ticks / TicksPerSecond
double TotalMilliseconds Чтение = (double) Ticks / TicksPerMillisecond


Для последних пяти свойств я указал формулы, при помощи которых они вычисляются из значений соответствующих полей структуры TimeSpan.

Ранее я говорил о том, что структура DateTime содержит перегруженный оператор сложения. Однако к объекту DateTime можно прибавить только объект TimeSpan. Если dt, dt1 и dt2 — объекты DateTime, a ts — объект TimeSpan, вы вправе провести такое сложение:

  dt2 = dt1 + ts;

или такое:

  dt += ts;

Например, вы хотите увеличить значение времени и даты на 45 минут:

  dt += new TimeSpan(0, 45, 0);

или на одну неделю:

  dt += new TimeSpan(7, 0, 0, 0);

Это безопасный способ таких вычислений. (Другой безопасный способ — использовать методы Add класса DateTime.) Оператор вычитания определяется двумя способами. Вы можете вычесть одну дату из другой и получить объект TimeSpan:

  ts = dt2 - dt1;

Или вычесть объект TimeSpan из объекта DateTime, получив как результат объект DateTime:

  dt2 = dt1 - ts;

или:

  dt -= ts;

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


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

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