Обучение C#

Формула программиста
основатель — Волосатов Евгений Витольдович

Работа с датой и временем

Для работы с датой и временем язык C# предусматривает структуру DateTime, описанную в пространстве имен System.

Свойства структуры DateTime

Структура DateTime содержит следующие свойства:
  • Date – собственно структура типа DateTime;
  • DayOfWeek – день недели – является членом перечисления DayOfWeek:
    • Monday – понедельник,
    • Tuesday – вторник,
    • Wednesday – среда,
    • Thursday – четверг,
    • Friday – пятница,
    • Saturday – суббота,
    • Sunday – воскресенье.
  • DayOfYear – целочисленное значение дня заданного года от 1 до 366.
  • Hour – количество часов заданного дня от 0 до 23;
  • Kind – представляет собой значение, указывающее, какое время указано текущим экземпляром структуры DateTime, является членом перечисления Kind:
    • Local – местное время
    • Utc – время представлено стандартом UTC.
    • Unspecified – время не определено ни как местное, ни как UTC.
  • Millisecond – количество миллисекунд заданной даты от 0 до 999.
  • Minute – количество минут заданной даты от 0 до 59.
  • Month – значение месяца заданной даты от 1 до 12.
  • Second – количество секунд заданной даты от 0 до 59.
  • Year – год заданной даты от 0001 до 9999.
  • TimeOfDay – время дня для заданной даты (с точностью до 100 наносекунд).
  • Ticks – число 100-наносекундных тактов в формате Int64 начиная с 00:00:00 1 января 0001 года.
Кроме того, структура DateTime содержит статические свойства и поля:
  • Now – представляет собой свойство DateTime, содержащее текущую дату и время данного компьютера в формате местного времени.
  • UtcNow - представляет собой свойство DateTime, содержащее текущую дату и время данного компьютера в формате UTC.
  • Today – представляет собой текущую дату.
  • MinValue – наименьшее значение типа DateTime.
  • MaxValue – наибольшее значение типа DateTime.
  • IsLeapYear(Int32 year) – возвращает логическое значение true если переданный год является високосным и false в противном случае.
  • DaysInMonth(Int32 year, Int32 month) – возвращает количество дней в указанном месяце указанного года.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine(DateTime.MinValue + " - "
      + DateTime.MaxValue);
      Console.WriteLine(DateTime.MinValue.Ticks + " - "
      + DateTime.MaxValue.Ticks);
      Console.ReadKey();
    }
  }
}
image articles/519/519_1.png
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("IsLeapYear(2016) = "
      + DateTime.IsLeapYear(2016));
      Console.WriteLine("DaysInMonth(2016, 2) = "
      + DateTime.DaysInMonth(2016, 2));
      Console.ReadKey();
    }
  }
}
image articles/519/519_2.png
 

Конструкторы структуры DateTime

Структура DateTime содержит ряд конструкторов, позволяющих инициализировать объект. Наиболее часто используемые из них:
  • Указанной датой - DateTime(год, месяц, день);
  • Указанной датой и временем – DateTime(год, месяц, день, часы, минуты, секунды);
  • Указанным 64-разрядным количеством TicksDateTime(Ticks).

Рассмотрим пример инициализации даты и получения ее отдельных свойств.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      DateTime dt = new DateTime(1978, 6, 8, 3, 5, 0);
      Console.WriteLine("Set date: " + dt.Day + "." + dt.Month + "."
    + dt.Year + " " + dt.Hour + ":" + dt.Minute + ":" + dt.Second);
      dt = DateTime.Now;
      Console.WriteLine("Now: " + dt);
      Console.WriteLine("Date: " + dt.Date);
      Console.WriteLine("TimeOfDay: " + dt.TimeOfDay);
      Console.WriteLine("Milliseconds: " + dt.Millisecond);
      Console.WriteLine("DayOfWeek: " + dt.DayOfWeek);
      Console.WriteLine("DayOfYear: " + dt.DayOfYear);
      Console.WriteLine("Ticks: " + dt.Ticks);
      Console.ReadKey();
    }
  }
}
image articles/519/519_3.png

При попытке инициализации объекта DateTime недопустимыми значениями возникает исключение:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      DateTime dt;
      try
      {
        dt = new DateTime(2016, 2, 31); // 31 февраля
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex.Message);
      }
      Console.ReadKey();
    }
  }
}
image articles/519/519_4.png

 

Ввод данных структуры DateTime

Для ввода даты и времени чаще всего используются статические методы Parse() и TryParse() структуры DateTime.
Метод Parse() в качестве аргумента принимает строку в одном из допустимых форматов для преобразования ее к объекту DateTime, который является возвращаемым значением функции. Если строку не удается корректно преобразовать в объект DateTime, возникает исключение.
Метод TryParse() принимает в качестве аргументов строку, которую необходимо преобразовать к объекту типа DateTime, а также переменную типа DateTime, обозначенную ключевым словом out, в которую необходимо сохранить преобразованную строку. Метод TryParse() является защищенным, и в случае невозможности корректного преобразования строки к формату DateTime, возвращает значение, равное 0, что соответствует дате DateTime.MiValue.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      DateTime dt;
      dt = DateTime.Parse(Console.ReadLine());
      Console.WriteLine(dt);
      DateTime.TryParse(Console.ReadLine(), out dt);
      Console.WriteLine(dt);
      Console.ReadKey();
    }
  }
}
image articles/519/519_5.png
image articles/519/519_6.png

Для того чтобы узнать поддерживаемые системой форматы ввода даты и времени можно воспользоваться методом GetDateTimeFormats(), который преобразует значение объекта DateTime во все строковые представления, поддерживаемые стандартным форматом даты и времени.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
        DateTime dt = DateTime.Now;
        string[] formats = dt.GetDateTimeFormats();
        Console.WriteLine("Количество поддерживаемых форматов: "
         ormats.Length);
        foreach (string format in formats)
          Console.WriteLine(format);
        Console.ReadKey();
    }
  }
}
image articles/519/519_7.png

 

Вывод данных структуры DateTime

Особого внимания заслуживает возможность форматированного вывода даты и времени. Для этого чаще всего используется перегруженный метод ToString() класса Object, который в качестве аргумента может принимать строку формата для вывода даты и времени.
ОбозначениеНазначениеВарианты использования
y год y
yy
yyyy
M месяц M
MM
MMM
MMMM
d день d
dd
ddd
dddd
h
H
час (12-часовой)
час(24-часовой)
h
hh
H
HH
m минута m
mm
s секунда s
ss
f тик f
ff
fff
ffff
fffff
ffffff
fffffff
z временная зона z
zz
zzz
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      DateTime dt = DateTime.Now;
      Console.WriteLine(dt.ToString("y yy yyyy"));
      Console.WriteLine(dt.ToString("M MM MMM MMMM"));
      Console.WriteLine(dt.ToString("d dd ddd dddd"));
      Console.WriteLine(dt.ToString("h hh H HH"));
      Console.WriteLine(dt.ToString("m mm"));
      Console.WriteLine(dt.ToString("s ss"));
      Console.WriteLine(dt.ToString("f ff fff ffff fffff
    ffffff fffffff"
));
      Console.WriteLine(dt.ToString("z zz zzzz"));
      Console.WriteLine(dt.ToString("dd-MM-yyyy
    HH:mm:ss.fffffff zzzz"
));
      Console.ReadKey();
    }
  }
}
image articles/519/519_8.png

 

Изменение данных структуры DateTime

Для изменения даты и времени относительно указанного значения можно воспользоваться следующими методами. Все эти методы возвращают новый объект DateTime и в качестве аргумента могут принимать как положительное, так и отрицательное значение.
  • AddDays(Double) - добавляет заданное число дней (полных и неполных) к указанному значению.
  • AddMonths(Int32) - добавляет заданное число месяцев к указанному значению.
  • AddYears(Int32) - добавляет заданное число лет к указанному значению.
  • AddHours(Double) - добавляет заданное число часов (полных и неполных) к указанному значению.
  • AddMinutes(Double) - добавляет заданное число минут (полных и неполных) к указанному значению.
  • AddSeconds(Double) - добавляет заданное число секунд (полных и неполных) к указанному значению.
  • AddMilliseconds(Double) - добавляет заданное число миллисекунд (полных и неполных) к указанному значению.
  • AddTicks(Int64) - добавляет заданное число 100-наносекундных тиков к указанному значению.
  • Add(TimeSpan) - добавляет значение TimeSpan к указанному значению DateTime. Структура TimeSpan используется для представления интервала времени, которая может быть проинициализирована следующим образом:
    • TimeSpan(часы, минуты, секунды)
    • TimeSpan(дни, часы, минуты, секунды)
    • TimeSpan(дни, часы, минуты, секунды, миллисекунды)
    • TimeSpan(тики)
В примере ниже вторая строка выводится через 5 секунд после первой.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      DateTime dt = DateTime.Now;
      Console.WriteLine(dt);
      dt = dt.AddSeconds(5);
      while (dt > DateTime.Now) ;
      Console.WriteLine(DateTime.Now);
      Console.ReadKey();
    }
  }
}
image articles/519/519_9.png

Кроме того, для изменения данных могут использоваться перегруженные операторы
  • + - складывает значение объекта DateTime и временной интервал TimeSpan;
  • - – вычитает значение объекта DateTime или TimeSpan из значения объекта DateTime.
10
dt = dt + new TimeSpan(0,0,5);
10
dt += new TimeSpan(0,0,5);
 

Сравнение данных структуры DateTime

Для сравнения объектов DateTime могут использоваться
  • Метод CompareTo(DateTime) – сравнивает указанное значение объекта с переданным в качестве аргумента. Возвращаемое значение меньше нуля если указанная дата раньше переданной в качестве аргумента, ноль если даты равны и больше нуля если указанная дата позже переданной в качестве аргумента.
  • Статический метод Compare(DateTime, DateTime) – сравнивает два переданных объекта DateTime и формирует возвращаемое значение аналогично предыдущему методу.
  • Метод Equals(DateTime) и статический метод Equals(DateTime, DateTime) – проверяют два объекта DateTime на равенство и возвращают логическое значение true (в случае равенства) или false (в случае неравенства).
  • Операторы сравнения, возвращающие логическое значение
    • > - больше;
    • < - меньше;
    • >= - больше или равно;
    • <= - меньше или равно;
    • == - равно;
    • != - неравно
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      DateTime dt1 = DateTime.Now;
      DateTime dt2 = dt1 - new TimeSpan(0, 0, 5);
      Console.WriteLine(dt1 + " CompareTo(" + dt2 + ") - "
      + dt1.CompareTo(dt2));
      Console.WriteLine(dt1 + " Equals(" + dt2 + ") - "
      + dt1.Equals(dt2));
      Console.WriteLine(dt1 + " == " + dt2 + " - " + (dt1 == dt2));
      Console.WriteLine(dt1 + " != " + dt2 + " - " + (dt1 != dt2));
      Console.WriteLine(dt1 + " < " + dt2 + " - " + (dt1 < dt2));
      Console.WriteLine(dt1 + " >= " + dt2 + " - " + (dt1 >= dt2));
      Console.ReadKey();
    }
  }
}
image articles/519/519_10.png



Потренироваться в использовании функций работы с датой и временем Вы можете, решая задачи
Автор: Вставская Елена Владимировна

 
Написать комментарий:




Начинаем практику по языку C#




Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

После заполнения формы ты будешь подписан на рассылку «C# Вебинары и Видеоуроки», у тебя появится доступ к видеоурокам и консольным задачам.

Несколько раз в неделю тебе будут приходить письма — приглашения на вебинары, информация об акциях и скидках, полезная информация по C#.

Ты в любой момент сможешь отписаться от рассылки.