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. Другими словами:
365 + 1/4 - 1/100 + 1/400 = 365.2425
Создать объект 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 | < Назад | Оглавление | Далее > |