Лекция № 9
Тема: "Работа с данными дата/время"
План
1. Описание класса DateTime. Генерирование Даты / Времени.
2. Выделение частей из Даты / Времени
3. Функции преобразования Даты / Времени в текст
4. Функции расчета Даты / Времени. Cравнение Даты / Времени
5. Компоненты для работы с датами
1. Описание класса DateTime. Генерирование Даты / Времени
Для хранения даты, времени или обоих значений сразу в C# имеется специальный класс DateTime.
Класс имеет свойства, позволяющие возвращать текущие значения даты и времени:
DateTime.Now - возвращает текущую дату и время на компьютере
DateTime.Today - возвращает текущую дату на компьютере
Например:
//опишем две переменные
DateTime d,dt;
//присвоим переменной текущую дату
d=DateTime.Today;
//присвоим переменной текущую дату и время
dt=DateTime.Now;
Если нужно записать произвольную дату, то ее привычнее задавать в текстовом формате, а затем конвертировать в тип DateTime. Для этого используются метод класса Convert.
Convert.ToDateTime("дата/время")
Работа данного метода имеет особенности:
- если указана только дата, то время записывается как 0:00:00;
- если указано только время, то дата записывается как текущая на компьютере;
- если указана дата и время, то записываются указанные значения
Пример:
DateTime d, t, dt;
d=Convert.ToDateTime("15.01.2020"); // записали в переменную дату (время будет 0:00:00)
t=Convert.ToDateTime("12:45"); // записали в переменную время (дата будет текущая)
dt=Convert.ToDateTime("15.01.2014 12:45"); // записали в переменную дату и время
Если Вы хотите получить только дату или только время, то из полученного значения даты/времени можно извлечь нужную часть с помощью подсвойств, которые будут рассмотрены в следующем разделе лекции.
Существует еще один способ генерирования дат, в котором каждая часть даты или времени задается с помощью целых чисел. Для этого переменной присваивается конструктор класса DateTime, в качестве параметров которого задаются нужные значения даты/времени.
Приведем наиболее подходящие синтаксисы вызова конструктора:
- new DateTime(int year, int month, int day) //задаем год, месяц, день (время записывается как 0:00:00)
- new DateTime(int year, int month, int day, int hours, int minutes, int seconds) //задаем год, месяц, день, часы, минуты, секунды
Пример:
DateTime d, t, dt;
d=new DateTime(2020,1,15); // генерируется дата 15.01.2020 (время будет 0:00:00)
dt=new DateTime(2020,1,15,12,45,0); // генерируется 15.01.2020 12:45:00
2. Выделение частей из Даты / Времени
При работе с классом DateTime часто возникает необходимость выделить из его значения какую-то часть. Для этого каждое значение дата/время имеет собственные свойства:
- Date - возвращает значение даты из DateTime (значение времени все равно записывается как 0:00:00)
- Day - возвращает номер дня из даты
- DayOfWeek - возвращает название дня недели в формате DayOfWeek
- DayOfYear - возвращает номер дня в году
- Hour - возвращает значение часов из времени
- Millisecond - возвращает значение миллисекунд из времени
- Minute - возвращает значение минут из времени
- Month - возвращает номер месяца из даты
- Second - возвращает значение секунд из времени
- TimeOfDay - возвращает значение времени из DateTime в формате TimeSpan
- Year - возвращает значение года из даты
Примеры
//переменная для записи даты
DateTime date;
//переменная для записи времени
TimeSpan time;
//переменные для записи дня, месяца и года
int d, m, y;
//переменная для записи дня недели
DayOfWeek w;
//переменные для записи часов, минут, секунд
int h, n, s;
date=DateTime.Today.Date; // текущая дата
d=DateTime.Today.Day; //текущий день
m=DateTime.Today.Month; // текущий месяц
w=DateTime.Today.DayOfWeek; // название текущего дня недели
y=DateTime.Today.Year; // текущий год
//при работе со временем используем свойство Now
//потому что используемое выше свойство Today время не возвращает
time=DateTime.Now.TimeOfDay; //текущее время
h=DateTime.Now.Hour; // значение часов в текущий момент
n=DateTime.Today.Minute; // значение минут в текущий момент
s=DateTime.Today.Second; // значение секунд в текущий момент
3. Методы преобразования Даты / Времени в текст
Как было сказано выше, класс DateTime содержит сразу два значения: дату и время. Кроме этого данный формат нельзя просто так отобразить на форме или вывести в виде текста. Поэтому существуют специальные методы, которые позволяют преобразовать значение даты/времени в текст и задать формат вывода (только дата, только время или другие форматы).
Экземпляры класса DateTime, как и любые другие экземпляры классов в C#, имеют метод ToString(), который конвертирует значение даты/времени в текст, готовый для вывода. Однако в виде строки Вы получите значение даты и времени одновременно, что не всегда необходимо.
Метод ToString() класса DateTime в качестве параметра может принимать формат, в соответствии с которым значение дата/время будет преобразовано в текст.
Формат может содержать следующие символы:
d - день (если использовать сочетание "ddd", то отображается сокращенное название дня недели - "Пн", "Вт" и т.д. Если использовать сочетание "dddd", то отображается полное название дня недели)
M - месяц (если использовать сочетание "MMM", то отображается сокращенное название месяца - "Янв", "Фев" и т.д. Если использовать сочетание "MMMM", то отображается полное название месяца)
y - год
h - часы
m - минуты
s - секунды
/ - разделитель дат
: - разделитель времени
' ' - символ, заключенный в кавычки воспринимается именно как символ
Остальные символы отображаются как в шаблоне:
Пример:
DateTime d;
d=DateTime.Now;
MessageBox.Show("Дата в обычном формате: "+ d.ToString("dd/MM/yyyy")); //дд.мм.гггг
MessageBox.Show("Дата в формате Access: "+ d.ToString("#dd'/'MM'/'yyyy#")); //#мм/дд/гггг#
MessageBox.Show("Дата в формате MySQL: "+ d.ToString("yyyy-MM-dd")); //мм-дд-гггг
MessageBox.Show('Сегодня: '+ d.ToString("dddd dd MMMM yyyy hh:mm:ss")); //день недели, в дате название месяца полностью, время
Кроме задания форматов вывода существуют методы быстрого форматирования даты/времени в наиболее часто используемые форматы:
ToLongDateString() - конвертирует дату/время в длинный формат даты (месяц записан текстом)
ToLongTimeString() - конвертирует дату/время в длинный формат времени чч:мм:сс
ToShortDateString() - конвертирует дату/время в краткий формат даты дд.мм.гг
ToShortTimeString() - конвертирует дату/время в краткий формат времени чч:мм (без секунд)
Пример.
DateTime d;
//записываем теущую дату и время
d=DateTime.Now;
//выводим дату в длинном формате
MessageBox.Show(a.ToLongDateString());
//выводим время в длинном формате
MessageBox.Show(a.ToLongTimeString());
//выводим дату в коротком формате
MessageBox.Show(a.ToShortDateString());
//выводим время в коротком формате
MessageBox.Show(a.ToShortTimeString());
4. Функции расчета Даты / Времени. Сравнение Даты / Времени
Для выполнения расчетов с датой DateTime можно использовать методы вида:
AddDays(int n) - добавляет к дате указанное число дней
AddHours (int n) - добавляет к дате указанное число часов
AddMillisecond(int n) - добавляет к дате указанное число миллисекунд
AddMinutes(int n) - добавляет к дате указанное число секунд
AddMonths(int n) - добавляет к дате указанное число месяцев
AddSeconds(int n) - добавляет к дате указанное число секунд
AddYears(int n) - добавляет к дате указанное число лет
Пример.
DateTime d;
//записываем в переменную ткущую дату/время
d=DateTime.Now;
//увеличиваем текущую дату на 10 дней
d=d.AddDays(10);
//уменьшаем текущую дату на 2 месяца
d=d.AddMonths(-2);
//увеличивает текущую дату на 3 года
d=d.AddYears(3);
Существует возможность узнать сколько между датами дней, часов, минут, секунд. Для этого из первой даты вычитают вторую, а для полученной разности вызывают специальные свойства:
TotalDays() - всего дней между датами
TotalHours() - всего часов между датами
TotalMinutes() - всего минут между датами
TotalSeconds() - всего секунд между датами
Пример.
DateTime d1,d2;
//первая переменная равна 1 января текущего года
d1=new DateTime(DateTime.Now.Year, 1,1);
//вторая переменная равна текущей дате
d2=DateTime.Now;
double d,h,m,s;
d=(d2-d1).TotalDays; //всего дней между датами
h=(d2-d1).TotalHours; //всего часов между датами
m=(d2-d1).TotalMinutes; //всего минут между датами
s=(d2-d1).TotalSeconds; //всего секунд между датами
Для сравнения дата и времени употребляют стандартные операции отношения ==, != , > , > =, < ,< =. Также существует функция сравнения даты и времени:
Пример:
DateTime a, b;
a=Convert.ToDateTime("05.01.2020");
b=Convert.ToDateTime("10.01.2020");
a > b - false
a < b - true
5. Компоненты для работы с датами
Для работы с датами желательно использовать компоненты, которые защищают пользователя от ошибок ввода. К таким компонентам относятся DateTimePicker и MonthCalendar. Оба компонента имеют идентичные характеристики, но отличаются внешним видом: первый компонент - это поле с раскрывающимся календарем, второй - это календарь на отдельный месяц. Первый экономит место на форме, второй - более наглядный, так как сразу отображает все даты месяца.
Основные свойства компонентов:
|
Свойство |
Описание |
|
Name |
Имя компонента для обращения к нему в коде |
| CustomFormat | Пользовательский формат. Имеет смысл, если свойство Format = Custom |
| Format | Формат отображения данных: Long - длинный формат даты, Short - короткий формат даты, Time - время, Custom - пользовательский формат. По умолчанию Long |
| SelectionRange | Выбранное значение в компоненте MonthCalendar |
| Value | Выбранное значение даты и времени в компоненте DateTimePicker |
Пример. Пусть на форме имеются два компонента DateTimePicker. Необходимо при запуске формы в первом компоненте отображать первое число текущего месяца, а во втором - дату через 50 дней от первого компонента.
В событии Load формы напишем код:
private void Form1_Load(object sender, EventArgs e)
{
//первый компонент: текущий год, текущий месяц, первое число
dateTimePicker1.Value = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1);
//второй компонент: первый увеличиваем на 50 дней
dateTimePicker2.Value = dateTimePicker1.Value.AddDays(50);
}
Вопросы для самоконтроля
1. Как описать экземпляр класса для работы с датой/временем? Как сгенерировать в экземпляре класса текущую дату/время?
2. Как записать в экземпляр класса любую дату? Как выделить из даты/времени нужную часть?
3. Как вывести дату в произвольном формате? Приведите символы шаблона.
4. Как посчитать интервал между датами/временами и увеличить дату/время на заданное значение?
5. Какие компоненты существуют для работы с датами? Опишите их свойства.