Иногда бывает необходимо работать с датами и временем. Особенно эти задачи актуальны в системах планирования. Одна из таких задач может выражаться в точном определении даты и времени нахождения рейсового морского лайнера в пунктах остановки. Ну к примеру, круизный лайнер совершает турне по крупнейшим морским портам мира. Естественно, весь его маршрут заранее определен и точно рассчитаны время прибытия и отправления в каждом порту. Как это рассчитывается программно? Очень просто.
Возьмем дату и время стартового отправления корабля. Например, это 15.07.2010 в 14:30.
Что бы рассчитать планируемое время прибытия в некоторый другой порт, следует знать общее время движения лайнера. Возьмем для примера 2 дня, 8 часов и 20 минут.
Определяем точное время прибытия лайнера в другой порт через 2 дня 8 часов и 20 минут после отплытия 15 июля 2010 года в 14 часов 30 минут. Для этого используем методы AddDays, AddHours, AddMinutes.
//Время отправления:
DateTime departuTime = DateTime(2010, 7, 15, 14, 30, 0);
//Время прибытия:
DateTime arrivalTime =
departuTime.AddDays(2).AddHours(8).AddMinutes(20);
MessageBox.Show(arrivalTime.ToString());
В итоге получим время: 17.07.2010 22:50
Ну хорошо. А что, если необходимо наоборот – узнать необходимое время отплытия, что бы 3.10.2012 в 8:12 прибыть во второй порт, зная, что плыть к нему предется 7 дней, 21 час и 30 минут?
Опять же можем воспользоваться теми же методами, но только параметры будем передавать со знаком "-".
//Определяем время прибытия:
DateTime departuTime = new DateTime(2012, 10, 3, 8, 12, 0);
//Получаем время отправления:
DateTime arrivalTime =
departuTime.AddDays(-7).AddHours(-21).AddMinutes(-30);
MessageBox.Show(arrivalTime.ToString());
Получим время отправления: 25.09.2012 10:42
Заметьте, что работая с типом DateTime вовсе нет необходимости заботится о чередовании количества дней в месяцах и количество дней в высокосном году. Тип DateTime достаточно умный что бы все эти нюансы учитывать самому.
Но, если вы все же желаете получать более раннюю дату и время от текущей, то лучше все таки пользоваться методом Subtruct с созданием объекта TimeSpan (представляющего временной отрезок):
DateTime departuTime = new DateTime(2012, 10, 3, 8, 12, 0);
DateTime arrivalTime =
departuTime.Subtract(new TimeSpan(7, 21, 30, 0));
MessageBox.Show(arrivalTime.ToString());
Опять получили время отправления: 25.09.2012 10:42.
Как видите, тип DateTime весьма полезен и удобен. Все что нужно для плодотворной работы с ним, это немножечко поинтересоваться его возможностями. Знание этого класса сэкономит вам много времени и избавит от неприятных ошибок.