Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
71
Добавлен:
09.05.2015
Размер:
1.57 Mб
Скачать

возвращают новое, изменённое значение. Т.е. datNow.AddDays(27) – не изменит значение переменной datNow, но вернёт новое значение типа DateTime, котрое может быть присвоено некоторой переменной, либо использовано как аргумент метода WriteLine.

Для типа DateTime определены операции сложения и вычитания. В результате выполнения операции вычитания получается значение нового типа –TimeSpan

(временной промежуток). Операция сложения может использоваться только с значениями типа TimeSpan, т.е. нельзя найти сумму двух дат, но можно добавить к дате некоторый временной промежуток.

Учебное задание 1.4.

Создать консольное приложение вычисляющее возраст пользователя по его дате рождения. Так же программа должна вычислять количество дней до следующего дня рождения.

Технология выполнения учебного задания 1.4.

Шаг 1. Создайте проект нового консольного приложения, назовите его Lab14.

Шаг 2. Откройте файл Program.cs, дважды кликнув по нему в окне

« Обозреватель решений».

Шаг 3. Для хранения даты используется тип DateTime, он сохраняет не только дату, но и время. Если время не указывается явно, по умолчанию оно считается

00:00:00. Т.к. метод ReadLine считывает пользовательский ввод в строковом формате, так же как и для других типов необходимо преобразование. Это можно сделать методом ToDateTime из класса Convert.

Для начала попробуем получить дату рождения пользователя и вывести её на экран (см. листинг 8).

static void Main(string[] args)

{

Console.WriteLine("Укажите дату вашего рождения..."); //дата в формате DD.MM.YYYY

string line = Console.ReadLine();

DateTime dtmBirthday = Convert.ToDateTime(line); Console.WriteLine("Дата вашего рождения {0}", dtmBirthday);

Console.ReadKey();

}

Листинг 8.

Шаг 4. Запустите программу. Обратите внимание на то, что дата рождения выводится вместе со временем, даже если время не указано. Чтобы выводилась только дата, нужно преобразовать переменную dtmBirthday в строку методом

ToString, указав шаблон преобразования “dd.MM.yyyy”. Т.е. в переменной всё равно будет храниться дата и время, но внешний вид значения DateTime может быть представлен по-разному.

Внешний вид значения DateTime — это результат операции форматирования.

Форматирование — это процесс преобразования значения в его строковое представление.

Таблица 4. Шаблоны преобразования для типа DateTime

Шаблон

Описание

Пример

 

 

 

"dd"

День месяца (от 01 до 31)

10.08.2011 23:45:30 -> 10

 

 

 

"MM"

Месяц (от 01 до 12)

10.08.2011 23:45:30 -> 08

 

 

 

"yyyy"

Четырёхзначный номер года

10.08.2011 23:45:30 -> 2011

 

 

 

"yy"

Двузначный номер года

10.08.2011 23:45:30 -> 11

 

 

 

"dd.MM.yyyy"

День.Месяц.Год

10.08.2011 23:45:30 -> 10.08.2011

 

 

 

"mm"

Минута (от 00 до 59)

10.08.2011 23:45:30 -> 45

 

 

 

"hh"

Часы (от 01 до 12)

10.08.2011 23:45:30 -> 11

 

 

 

"HH"

Часы (от 00 до 23)

10.08.2011 23:45:30 -> 23

 

 

 

"dddd"

День недели

10.08.2011 23:45:30 -> среда

 

 

 

Измените код самостоятельно так, чтобы выводилась только дата, без времени.

Метод ToString присутствует у переменной любого типа и позволяет задавать специфический строковый формат для данной переменной. Например для того,

чтобы преобразовать число типа int, в строку, не обязательно использовать метод

Convert.ToInt32(), можно просто написать [ИмяПеременной].ToString(). Пример.

int A = 100; double B = Math.PI; string C;

C = A;//ошибка!

C= Convert.ToString(A);//OK

C= A.ToString(); //OK

C= B;//ошибка!

C= Convert.ToString(B);//OK

C= B.ToString();//OK

C= B.ToString(".##");//OK (Округляем от сотых)

Шаг 5. Теперь вычислим возраст пользователя. Для этого вычтем текущую дату от даты рождения пользователя. Для определения текущей даты воспользуемся свойством DateTime.Now.

Было бы логично предположить, что найдя разницу между DateTime.Now и dtmBirthday мы получим какое то число, например количество дней. Однако это не так, в результате разницы двух дат получается значение нового типа – TimeSpan

(переводится как « промежуток времени»). На самом деле это очень удобно, т.к.

переменная типа TimeSpan позволяет узнать разницу в днях, секундах, минутах и даже миллисекундах. Более того, переменные типа TimeSpan могут участвовать в арифметических операциях с переменными типа DateTime, в то время как простые числа – нет.

Создадим новую переменную типа TimeSpan, назовём её difDate (см. листинг 9).

static void Main(string[] args)

{

Console.WriteLine("Укажите дату вашего рождения..."); //дата в формате DD.MM.YYYY

string line = Console.ReadLine();

DateTime dtmBirthday = Convert.ToDateTime(line); Console.WriteLine("Дата вашего рождения {0}",

dtmBirthday.ToString("dd.MM.yyyy"));

//difDate - временной промежуток между датой рождения и текущей датой TimeSpan difDate = DateTime.Now - dtmBirthday;

Console.WriteLine("С момента вашего рождения прошло:");

//делим кол-во дней на 365 дней в году, получаем возраст (years) int years = difDate.Days / 365;

Console.WriteLine("{0} лет {1} дней {2} часов {3} минут и {4} секунд", years,

difDate.Days % 365,//находим остаток от деления на 365 difDate.Hours,

difDate.Minutes,

difDate.Seconds);

Console.ReadKey();

}

Листинг 9.

В целочисленной переменной years сохраним возраст пользователя, для этого количество дней, прошедших с даты его рождения (difDate.Days) разделим на количество дней в году (365). 365 – несколько неточная цифра, т.к. надо учитывать ещё и високосные годы, но даже без их учёта мы получим достаточно хороший результат.

Шаг 6. Теперь вычислим дату следующего дня рождения пользователя. Для этого прибавим к дате его рождения его возраст + 1. После этого легко вычислить количество дней до его следующего дня рождения.

static void Main(string[] args)

{

Console.WriteLine("Укажите дату вашего рождения..."); //дата в формате DD.MM.YYYY

string line = Console.ReadLine();

DateTime dtmBirthday = Convert.ToDateTime(line); Console.WriteLine("Дата вашего рождения {0}",

dtmBirthday.ToString("dd.MM.yyyy"));

//difDate - временной промежуток между датой рождения и текущей датой TimeSpan difDate = DateTime.Now - dtmBirthday;

Console.WriteLine("С момента вашего рождения прошло:");

//делим кол-во дней на 365 дней в году, получаем возраст (years) int years = difDate.Days / 365;

Console.WriteLine("{0} лет {1} дней {2} часов {3} минут и {4} секунд", years,

difDate.Days % 365,//находим остаток от деления на 365 difDate.Hours,

difDate.Minutes,

difDate.Seconds);

DateTime btnNewBirthday = dtmBirthday.AddYears(years + 1); //Отображаем день недели (см. шаблоны преобразования) Console.WriteLine("Ваш следующий день рождения будет в {0}",

btnNewBirthday.ToString("dddd"));

Console.WriteLine("До следующего дня рождения осталось {0} дней", (btnNewBirthday-DateTime.Now).Days+1);

Console.ReadKey();

}

Листинг 10.

При выводе количества дней до следующего дня рождения мы добавляем ещё

+1, это делается потому что свойство Days содержит только целое количество дней,

кроме этого наверняка (если только программу не запускают ровно в 00:00:00)

содержит часы, минуты и секунды, которые составляют неполный, но всё же день.

Контрольные вопросы.

1.Каким образом можно получить текущую дату?

2.Что содержит значение типа TimeSpan?

3.Как можно преобразовать строковое представление даты в значение типа

DateTime?

4.Каким образом можно вывести в консоль только текущее время (без даты)?

5.Для чего используется операция %?

Самостоятельное задание 1.4.

Напишите консольное приложение, которое будет посчитывать количество дней,

минут и секунд до нового года (относительно текущей даты).

Соседние файлы в папке Методичка (1 сем)