Практическое занятие 8
Тема: Работа с датами и временем.
Цель работы: получить практические навыки по использованию функций для работы с датой/временем. Отработать навыки использования компонентов для работы с датами.
Ход работы
Создайте учебную форму для проверки возможностей работы с датами и временем.

Указания: для формы задайте свойства: Text='Работа с датами', FormBorderStyle=FixedSingle, MaximizeBox=false, StartPosition=CenterScreen.
Процесс создания содержимого формы разобьем на несколько простых шагов, указанных ниже.
Создать форму с панелью инструментов, у которой в правой части отображается текущая дата и время
![]()
Указания: Нанесите на форму компонент StatusStrip. На созданной панели с помощью кнопки создайте два компонента StatusLabel. Для каждого компонента задайте свойства: AutoSize = false, Text очистить, Size - Width = задайте так, чтобы компоненты заполнили всю строку статуса.
В событии Load формы напишем команду отображения текущей даты.
void MainFormLoad(object sender, EventArgs e)
{
toolStripStatusLabel2.Text=DateTime.Now.ToString("Сегодня: dddd dd/MM/yyyy HH:mm:ss");
}
Время должно обновляться каждую секунду. Для этого нанесите на форму компонент Timer. В его событии Tick введите код:
void Timer1Tick(object sender, EventArgs e)
{
toolStripStatusLabel2.Text=DateTime.Now.ToString("Сегодня: dddd dd/MM/yyyy HH:mm:ss");
}
На панели разместить два выпадающих поля с календарем для задания диапазона поиска данных. При этом первый календарь по умолчанию отображает первое число текущего месяца, а второй - текущую дату.

Указания: нанесите на форму компонент GroupBox и задайте свойство Text='Задание 1 (поиск)'. На панели разместите два компонента DataTimePicker. По умолчанию в календарях даты отображаются в полном формате: имена месяцев записаны полностью. Для отображения даты в обычном формате задайте для календаря свойство Format=short.
Для отображения в компонентах значений, указанных в задании в событие Load формы добавьте команды:
//описываем переменную и записываем в нее первое число текущего месяца
DateTime d=new DateTime(DateTime.Today.Year,DateTime.Today.Month,1);
//в первом календаре отображаем сформированное выше значение
dateTimePicker1.Value=d;
//во втором календаре отображаем текущую дату
dateTimePicker2.Value=DateTime.Today.Date;
Пусть имеется текстовый файл, в котором записаны некоторые показатели в формате
дата число1 число2 число3
Необходимо реализовать функцию, при которой в поле Memo выдаются только те данные из файла, даты которых попадают в заданный диапазон. При этом те строки, которые не попадают в интевал, в файле помечаются значком "-" в конце строки.
Указания: В текстовом редакторе создайте такой файл и сохраните на диске. На панели разместите компонент TextBox и задайте свойства: MultiLine=true, ScrollBars=Vertical, Text очистить.
Внизу разместите две кнопки Button и в свойстве Text задайте надписи на них.
Для открытия текстового файла нанесите на форму компонент OpenFileDialog и задайте свойство Filter=Текстовые файлы|*.txt.
Для работы с файлами подключите пространство имен
using System.IO;
Для первой кнопки напишем код:
void Button1Click(object sender, EventArgs e)
{
//если начало диапазона превышает конец, то конец подпрограммы
if (dateTimePicker1.Value>dateTimePicker2.Value) return;
//если пользователь в диалоге не выбрал файл, то конец подпрограммы
if (openFileDialog1.ShowDialog()!=DialogResult.OK) return;
//переменные для имени файла и для чтения из файла
string file, s;
//записываем в переменную имя выбранного в диалоге файла
file = openFileDialog1.FileName;
//загружаем в память выбранный файл для чтения
StreamReader sr = new StreamReader(file);
//создаем временный файл "temp" для записи
StreamWriter sw = new StreamWriter("temp");
//пока не достигнут конец файла
while (!sr.EndOfStream)
{
//считываем в переменную строку из файла
s=sr.ReadLine();
//для выделения даты из строки используем метод строковых переменных s.Substring(0,10)
//начиная с 0 позиции выделяем 10 символов
//если первые десять символов в строке (дата) попадают в диапазон дат
if (Convert.ToDateTime(s.Substring(0,10))>=dateTimePicker1.Value
&& Convert.ToDateTime(s.Substring(0,10))<=dateTimePicker2.Value)
{
//строка отображается в поле на форме
textBox1.AppendText(s+Environment.NewLine);
//строка записывается во временный файл без изменений
sw.WriteLine(s);
}
//в противном случае, если дата не попадает в диапазон
else
//строка записывается во временный файл с добавлением "-"
sw.WriteLine(s+"-");
}
//закрываем файлы
sr.Close();
sw.Close();
//удаляем исходный файл
File.Delete(file);
//переименовываем временный файл под исходным именем
File.Move ("temp", file);
}
Для второй кнопки напишите код:
void Button2Click(object sender, EventArgs e)
{
//описываем переменную и записываем в нее первое число текущего месяца
DateTime d=new DateTime(DateTime.Today.Year,DateTime.Today.Month,1);
//в первом календаре отображаем сформированное выше значение
dateTimePicker1.Value=d;
//во втором календаре отображаем текущую дату
dateTimePicker2.Value=DateTime.Today.Date;
//очищаем текстовое поле
textBox1.Clear();
//ставим фокус в первый календарь
dateTimePicker1.Focus();
}
Создайте панель для вычисления диапазона даты/времени.

Указания: нанесите на форму компонент GroupBox и задайте свойство Text='Задание 2 (диапазоны)'. На панели разместите два компонента DateTimePicker. Для отображения даты в обычном формате задайте для календаря свойство Format=short.
Как и ранее, в первом поле отобразим первый день текущего месяца, а во втром - текущую дату. Для этого в событие Load формы добавьте команды:
//третий календарь равен дате первого календаря
dateTimePicker3.Value=dateTimePicker1.Value;
//четвертый календарь равен дате второго календаря
dateTimePicker4.Value=dateTimePicker2.Value;
Ниже разместите компонент GroupBox (Standard) и задайте свойство Text='Расчет диапазона'. Для создания переключателей нанесите на форму 3 компонента RadioButton и в свойстве Text задайте названия переключателей. Для задания активным первого переключателя задайте свойство Checked=true.
Разместите текстовое поле TextBox для отображения результата. Задайте свойства: ReadOnly=true, Text очистить.
Разместите кнопку Button. В свойстве Text укажите надпись на кнопке.
Для кнопки введите код:
void Button3Click(object sender, EventArgs e)
{
//если начало диапазона превышает конец, то конец подпрограммы
if (dateTimePicker3.Value>dateTimePicker4.Value) return;
//если выбран первый переключатель
if (radioButton1.Checked)
//в поле показываем разницу в днях
textBox2.Text=(dateTimePicker4.Value.Date-dateTimePicker3.Value.Date).TotalDays.ToString();
//если выбран второй переключатель
else if (radioButton2.Checked)
//в поле показываем разницу в часах
textBox2.Text=(dateTimePicker4.Value.Date-dateTimePicker3.Value.Date).TotalHours.ToString();
//если выбран третий переключатель
else if (radioButton3.Checked)
//в поле показываем разницу в минутах
textBox2.Text=(dateTimePicker4.Value.Date-dateTimePicker3.Value.Date).TotalMinutes.ToString();
}
Реализуйте возможность изменения даты на указанное количество лет, месяцев или дней. При этом результат выводится в форматах в разных форматах.

Указания: нанесите на форму компонент GroupBox и задайте свойство Text='Задание 3 (расчет)'. На панели разместите компонент DateTimePicker.Для отображения даты в обычном формате задайте для календаря свойство Format=short.
Для отображения в нем текущей даты в событие Load формы добавьте команду:
//пятый календарь равен дате первого календаря
dateTimePicker5.Value=dateTimePicker1.Value;
Разместите текстовое поле TextBox для ввода значения изменения даты. Очистите свойство Text.
Ниже разместите компонент GroupBox и задайте свойство Text='Вид расчета'. Для создания переключателей нанесите на форму 3 компонента RadioButton и в свойстве Text задайте названия переключателей. Для задания активным первого переключателя задайте свойство Checked=true.
Рядом разместите еще один компонент GroupBox и задайте свойство Text='Формат вывода'. Для создания переключателей нанесите на форму 3 компонента RadioButton и в свойстве Text задайте названия переключателей. Для задания активным первого переключателя задайте свойство Checked=true.
Разместите текстовое поле TextBox для отображения результата. Задайте свойства: ReadOnly=true, Text очистить.
Разместите кнопку Button. В свойстве Text укажите надпись на кнопке.
Для кнопки введите код:
void Button3Click(object sender, EventArgs e)
{
//переменная для записи результата
DateTime rez=new DateTime();
//если выбран первый переключатель в группе "Вид расчета"
if (radioButton4.Checked)
//к значению календаря добавляем заданное число лет
rez=dateTimePicker5.Value.AddYears(Convert.ToInt16(textBox3.Text));
//иначе, если выбран второй переключатель в группе "Вид расчета"
else if (radioButton5.Checked)
//к значению календаря добавляем заданное число месяцев
rez=dateTimePicker5.Value.AddMonths(Convert.ToInt16(textBox3.Text));
//иначе, если выбран третий переключатель в группе "Вид расчета"
else if (radioButton6.Checked)
//к значению календаря добавляем заданное число дней
rez=dateTimePicker5.Value.AddDays(Convert.ToInt16(textBox3.Text));
//если выбран первый переключатель в группе "Формат вывода"
if (radioButton7.Checked)
//выведем ответ в первом формате
textBox4.Text=rez.ToString("dd/MM/yyyy");
//иначе, если выбран второй переключатель в группе "Формат вывода"
else if (radioButton8.Checked)
//выведем ответ во втором формате
textBox4.Text=rez.ToString("#MM'/'dd'/'yyyy#");
//иначе, если выбран третий переключатель в группе "Формат вывода"
else if (radioButton9.Checked)
//выведем ответ в третьем формате
textBox4.Text=rez.ToString("yyyy-MM-dd");
}