Лекция № 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. Какие компоненты существуют для работы с датами? Опишите их свойства.