Содержание
При работе с датой/временем в C# довольно часто приходится сталкиваться со структурой TimeSpan. Структура TimeSpan представляет собой временной интервал со знаком, то есть, с использованием этой структуры, мы можем получать как положительное, так и отрицательное число, например, дней, часов и так далее. Структура TimeSpan используется, в частности, в случае, когда нам необходимо вычесть из одной структуры DateTime другую.
Свойства TimeSpan
Наиболее часто свойства TimeSpan используются при получении разницы (интервала времени) между двумя переменными типа DateTime. Например,
static void Main(string[] args)
{
DateTime date1 = new DateTime(2022, 2, 1, 8, 0, 15); //01.02.2022 08:00:15
DateTime date2 = new DateTime(2022, 2, 18, 13, 30, 30);//018.02.2022 13:30:30
TimeSpan interval = date1.Subtract(date2);
Console.WriteLine(interval.ToString());
}
В этом случае мы получим отрицательное значение:
То есть, разница между двумя датами составляет 17 дней 5 часов 30 минут и 15 секунд. При этом, чаще всего, нам необходимо знать разницу двух DateTime, выраженную не столько в виде структура TimeSpan, сколько в каких-либо конкретных единицах времени — днях, часах, минутах, секундах и т.д. И для этого у TimeSpan имеются следующие свойства:
Days |
Возвращает количество дней периода времени, представленного текущей структурой TimeSpan. |
Hours |
Возвращает количество часов периода времени, представленного текущей структурой TimeSpan. |
Minutes |
Возвращает количество минут периода времени, представленного текущей структурой TimeSpan. |
Seconds |
Возвращает количество секунд периода времени, представленного текущей структурой TimeSpan. |
Milliseconds |
Возвращает количество миллисекунд периода времени, представленного текущей структурой TimeSpan. |
Ticks |
Возвращает количество тактов, представляющее значение текущей структуры TimeSpan. |
TotalDays |
Возвращает значение текущей структуры TimeSpan, выраженное в количестве дней. |
TotalHours |
Получает значение текущей структуры TimeSpan, выраженное в количестве часов. |
TotalMinutes |
Возвращает значение текущей структуры TimeSpan, выраженное в количестве минут. |
TotalSeconds |
Возвращает значение текущей структуры TimeSpan, выраженное в количестве секунд. |
TotalMilliseconds |
Получает значение текущей структуры TimeSpan, выраженное в количестве миллисекунд. |
Чтобы увидеть, чем отличаются свойства, начинающиеся с Total... от их аналогов, допишем наш пример следующим образом:
DateTime date1 = new DateTime(2022, 2, 1, 8, 0, 15); //01.02.2022 08:00:15
DateTime date2 = new DateTime(2022, 2, 18, 13, 30, 30);//018.02.2022 13:30:30
TimeSpan interval = date1.Subtract(date2);
Console.WriteLine($"TimeSpan = {interval}");
Console.WriteLine($"Days = {interval.Days}");
Console.WriteLine($"TotalDays = {interval.TotalDays}");
В консоли мы увидим следующий вывод:
Days = -17
TotalDays = -17,229340277777776
На этом примере видно, что, когда мы получаем значение свойства Days, то из значение TimeSpan берется только один компонент (количество дней), преобразуется в целое число и это число является значением свойства. Если же мы получаем значение TotalDays, то весь интервал TimeSpan преобразуется в количество дней и, в этом случае, значение свойства уже не будет целочисленным. Например, в нашем случае, разница между двумя датами составляет -17,22934… дней. Аналогичным образом работают и другие свойства TimeSpan.
Также, можно отметить то, что наиболее крупной единицей измерения у TimeSpan является день. Сделано это, прежде всего в целях согласованности, так как количество дней в месяце и году может различаться, а TimeSpan возвращает интервал времени не привязанный к какой-либо определенной дате.
Методы TimeSpan
У TimeSpan определены также различные методы, которые можно использовать, например, для сложения и вычитания двух TimeSpan. Ниже представлены основные методы TimeSpan.
Compare(Time |
Сравнивает два значения TimeSpan и возвращает целое значение, которое показывает, является ли первое значение короче, равно или длиннее второго значения. |
Математические операции с TimeSpan |
|
Add(Time |
Возвращает новый объект TimeSpan, значение которого равно сумме указанного объекта TimeSpan и данного экземпляра. |
Subtract(Time |
Возвращает новый объект TimeSpan, значение которого равно разности между указанным объектом TimeSpan и данным экземпляром. |
Multiply(Double) |
Возвращает новый объект TimeSpan, значение которого является результатом умножения данного экземпляра и указанного factor. |
Divide(Time |
Возвращает новое значение Double, которое является результатом деления данного экземпляра и указанного ts. |
Divide(Double) |
Возвращает новый объект TimeSpan, значение которого является результатом деления данного экземпляра и указанного divisor. |
Операции преобразования TimeSpan |
|
Negate() |
Возвращает новый объект TimeSpan, значение которого равно значению данного экземпляра с противоположным знаком. |
Duration() |
Возвращает новый объект TimeSpan, значением которого является абсолютное значение текущего объекта TimeSpan. |
Операции создания нового экземпляра TimeSpan |
|
From |
Возвращает объект TimeSpan, представляющий заданное количество дней, округленное до ближайшей миллисекунды. |
From |
Возвращает объект TimeSpan, представляющий указанное количество часов, округленное до ближайшей миллисекунды. |
From |
Возвращает объект TimeSpan, представляющий указанное количество миллисекунд. |
From |
Возвращает объект TimeSpan, представляющий указанное количество минут, округленное до ближайшей миллисекунды. |
From |
Возвращает объект TimeSpan, представляющий указанное количество секунд, округленное до ближайшей миллисекунды. |
From |
Возвращает объект TimeSpan, представляющий заданное время в тактах. |
Операции парсинга TimeSpan |
|
Parse(String) |
Преобразует строковое представление интервала времени в его эквивалент TimeSpan. |
Try |
Преобразовывает строковое представление интервала времени в его эквивалент TimeSpan и возвращает значение, позволяющее определить успешность преобразования. |
ParseExact(String, String, IFormatProvider) |
Преобразует строковое представление интервала времени в его эквивалент TimeSpan, используя указанные формат и сведения о форматировании, связанные с языком и региональными параметрами. Формат строкового представления должен полностью соответствовать заданному формату. |
Как можно видеть, кроме сложения и вычитания, для TimeSpan мы можем также применять и такие операции, как деление и умножение. Например,
DateTime date1 = new DateTime(2022, 2, 1, 8, 0, 15); //01.02.2022 08:00:15
DateTime date2 = new DateTime(2022, 2, 18, 13, 30, 30);//018.02.2022 13:30:30
TimeSpan interval = date1.Subtract(date2);
Console.WriteLine($"TimeSpan = {interval}");
TimeSpan multiInterval = interval.Multiply(2);
Console.WriteLine($"Удвоенный TimeSpan = {multiInterval}");
Вывод консоли:
Удвоенный TimeSpan = -34.11:00:30
Что касается методов From..., то с использованием этих методов можно создавать свои интервалы времени, например, так:
TimeSpan span = TimeSpan.FromSeconds(86400);//сутки
Console.WriteLine($"TimeSpan = {span}");
Вывод консоли:
Итого
Структура TimeSpan представляет собой интервал времени со знаком. Используя TimeSpan мы можем создавать интервалы времени, получать значение дней, часов, минут и т.д. прошедших с какого-либо момента времени или получать разницу двух значений DateTime.