Урок 25. Работа с DateTime C#


На 25 уроке учебника по основам C# мы завершим изучение типа данных DateTime, предоставленного C# и .NET Framework. В этой статье рассматривается манипулирование данными DateTime и форматирование информации о дате и времени в виде строки.

В предыдущих статьях учебника по основам C# рассматривалось создание и чтение данных DateTime и составных частей структуры. В этой статье мы будем манипулировать информацией DateTime, начиная с настройки значений DateTime. Это может быть достигнуто с помощью простых операторов или, для более сложного управления, с помощью методов DateTime.

Операторы сложения и вычитания

В структуре DateTime можно использовать два арифметических оператора. Это сложение ( + ) и вычитание ( -). Для каждого требуется два операнда. Первый - это значение DateTime для изменения, а второй - TimeSpan, содержащий количество времени для добавления или удаления.

DateTime theDate = DateTime.Parse("2 Jan 2017 20:16:00");
// Добавить один час, одну минуту и одну секунду
theDate = theDate + new TimeSpan(1, 1, 1);    // theDate = 2 Jan 2017 21:17:01
// Вычесть двадцать пять дней
theDate = theDate - new TimeSpan(25, 0, 0, 0);  // theDate = 8 Dec 2016 21:17:01
Эти два арифметических оператора могут также использоваться в качестве составных операторов присваивания. Ниже показано это после использования метода Parse для создания значения TimeSpan из строки.

DateTime theDate = DateTime.Parse("2 Jan 2017 20:15:00");
// Добавить один час, одну минуту и одну секунду
theDate += TimeSpan.Parse("01:01:01");        // theDate = 2 Jan 2017 21:16:01
// Вычесть двадцать пять дней
theDate -= TimeSpan.Parse("25.00:00:00");     // theDate = 8 Dec 2016 21:16:01
Методы Add

Методы Add позволяют больше контролировать обработку значений DateTime. Первым из них является сам метод Add, который добавляет TimeSpan к DateTime:

DateTime theDate = DateTime.Parse("2 Jan 2019 21:14:03");
TimeSpan duration = TimeSpan.Parse("1.01:01:01");
theDate = theDate.Add(duration);              // theDate = 3 Jan 2019 22:15:04
Метод Add обеспечивает не намного больший контроль над вычислением, чем простые арифметические операторы. Для более сложных расчётов, мы можем использовать методы добавления нескольких лет, месяцев и т. д. Существует даже метод Add, используемый для добавления тиков; один тик - одна десятимиллионная секунды. Все эти методы называются Add, за которым следует добавляемая единица времени. Значения могут вычитаться путем передачи отрицательного параметра методу Add. Каждый метод принимает одно число двойной точности (double) в качестве параметра, за исключением AddTicks, который требует длинный целочисленный параметр (long).

DateTime theDate = DateTime.Parse("2 Jan 2018);
theDate = theDate.AddYears(1);                // theDate = 2 Jan 2019
theDate = theDate.AddMonths(2);               // theDate = 2 Mar 2019
theDate = theDate.AddDays(1.5);               // theDate = 3 Mar 2019 12:00:00
theDate = theDate.AddHours(-6);               // theDate = 2 Mar 2019 06:00:00
theDate = theDate.AddMinutes(150);            // theDate = 2 Mar 2019 08:30:00
theDate = theDate.AddSeconds(10.5);           // theDate = 2 Mar 2019 08:30:10.5
theDate = theDate.AddMilliseconds(499);       // theDate = 2 Mar 2019 08:30:10.999
theDate = theDate.AddTicks(10000);            // theDate = 2 Mar 2019 08:30:11
Метод Subtract

Метод Subtract предоставляет функциональность, аналогичную основному методу Add. Однако, его можно использовать двумя способами. Во-первых, сроки могут быть вычтены из datetime и будет возвращен новый объект datetime. Во-вторых, одно значение DateTime может быть вычтено из другого, чтобы получить разницу во времени как TimeSpan.

DateTime theDate = DateTime.Parse("2 Jan 2007");
TimeSpan subtract = TimeSpan.Parse("1.01:00:00");
DateTime startDate = DateTime.Parse("1 Jan 2007");
DateTime endDate = DateTime.Parse("2 Jan 2007 12:00:00");
TimeSpan diff;
// Вычесть TimeSpan из DateTime
theDate = theDate.Subtract(subtract);         // theDate = 31 Dec 2006 23:00:00
// Найти разницу между двумя датами
diff = endDate.Subtract(startDate);           // diff = 1.12:00:00
Примечание: в приведенном выше примере разница между датами положительна, потому что вычитаемое время вычитается раньше, чем вычитаемое. Если верно обратное, то результат будет отрицательным.

Мировое и локальное преобразование типа datetime

Структура DateTime позволяет хранить значения всемирного координированного (UTC) и местного времени. Вы также можете конвертировать между этими значениями с помощью методов ToUniversalTime и ToLocalTime. В следующем примере Rangoon был выбран в настройках часового пояса окна для его смещения на шесть с половиной часов от UTC.

DateTime localDate = DateTime.Parse("1 Jul 2007 12:00");
DateTime utcDate = localDate.ToUniversalTime();     // 1 Jul 2007 05:30
DateTime rangoon = utcDate.ToLocalTime();           // 1 Jul 2007 12:00
Преобразование из DateTime в String

Структура DateTime предоставляет несколько методов для преобразования информации о дате и времени в строки, которые идеально подходят для отображения.

Основные преобразования

При установке Microsoft Windows пользователь выбирает регион, в котором он живет. Эта информация используется для определения формата дат и времени. Некоторые пользователи могут настроить свои настройки для достижения своих предпочтений для длинных и коротких дат и времени. Как разработчики, мы должны уважать их выбор, гарантируя, что данные наших программ используют эти параметры.

Структура DateTime предоставляет четыре метода преобразования значений DateTime в строки. Каждый из них позволяет автоматически генерировать строку, содержащую длинную или короткую дату или время. Имена методов: ToLongDateString, ToShortDateString, ToLongTimeString и ToShortTimeString. Ни одна из функций не имеет параметров.

Использование ToString со спецификаторами формата

Основное форматирование, предоставляемое вышеуказанными методами преобразования, полезно во многих случаях. Для большего контроля с помощью метода ToString можно указать спецификатор формата. Это позволяет использовать более широкий диапазон стилей даты и времени. Однако это ограничивает контроль пользователя над тем, как они просматривают вывод приложения.

DateTime theDate = DateTime.Parse("3 Jan 2007 21:25:30");
string result;
result = theDate.ToString("d");       // result = "03/01/2007"
result = theDate.ToString("f");       // result = "03 January 2007 21:25"
result = theDate.ToString("y");       // result = "January 2007"
Доступные спецификаторы формата

Полный список спецификаторов формата для преобразования DateTime выглядит следующим образом:



Стандартные спецификаторы формата полезны в большинстве случаев. Однако в некоторых случаях необходимо иметь полный контроль над позиционированием и стилем каждого элемента информации о дате и времени. Для этого можно использовать особые форматы, позволяющие создать дату по точному шаблону с использованием любой комбинации элементов из DateTime.

DateTime theDate = DateTime.Parse("3 Jan 2007 21:25:30");
string result;
result = theDate.ToString("d-MM-yy");       // result = "3-01-07"
result = theDate.ToString("HH:mm");         // result = "21:25"
result = theDate.ToString("h:mm tt");       // result = "9:25 PM"
В приведенном выше примере показаны несколько форматов и результаты. Полный список кодов форматирования выглядит следующим образом:

СпецификаторОписаниеПример
yГод с одной цифрой. Если год не может быть указан одной цифрой, то автоматически используются две цифры."7"
"95"
yyДвузначный год с ведущими нулями, если требуется"07"
yyyyПолный четырехзначный год."2007"
g or ggИндикатор Anno Domini (AD)."A.D."
MОднозначное число месяца. Если месяц не может быть указан одной цифрой, то автоматически используются две цифры."1"
"12"
MMДвузначный номер месяца с ведущими нулями при необходимости"01"
MMMТрехбуквенная аббревиатура месяца"Jan"
MMMMНазвание месяца."January"
dОднозначный номер дня. Если день не может быть указан в одной цифре, то автоматически используются две цифры."3"
"31"
ddДвузначный номер дня с ведущим нулем при необходимости"03"
dddТрехбуквенное название дня абревиатурой."Wed"
ddddИмя дня."Wednesday"
hОдноциферный час с использованием двенадцатичасового формата. Если час не может быть указан в одной цифре, то автоматически используются две цифры."9"
"12"
hhДве цифры часа при двенадцати часовом формате с ведущими нулями при необходимости."09"
HЧас с одной цифрой, используя формат двадцать четыре часа. Если час не может быть указан в одной цифре, то автоматически используются две цифры."1"
"21"
HHДве цифры часа в формате двадцать четыре часа с ведущими нулями при необходимости."09"
tОднобуквенный индикатор AM или PM, как правило, для использования с двенадцатичасовыми значениями часов."A"
"P"
ttДвухбуквенный индикатор AM или PM, как правило, для использования с двенадцатичасовыми значениями часов."AM"
"PM"
mОднозначное число минут. Если минута не может быть указана одной цифрой, то автоматически используются две цифры."1"
"15"
mmДвухзначные минуты с ведущими нулями, если требуется."01"
sОднозначное число секунд. Если секунда не может быть указана одной цифрой, то автоматически используются две цифры."1"
"59"
ssСекунды в двузначном формате с ведущими нулями при необходимости"01"
fДоля секунды. До семи f могут быть включены, чтобы указать количество десятичных знаков для отображения."0"
"0000000"
zОдноразрядное смещение часового пояса, указывающее разницу в часах между местным временем и временем по UTC. Если смещение не может быть задано одной цифрой, то автоматически используются две цифры."+6"
"-1"
zzДвухзначное смещение часового пояса, указывающее разницу в часах между местным временем и временем UTC с ведущими нулями, если требуется"+06"
zzzСмещение полного часового пояса, указывающее разницу в часах и минутах между местным временем и временем UTC с ведущими нулями, если требуется."+06:00"


Некоторые коды форматирования используют ту же букву, что и спецификатор формата. При использовании в строке формата, которая больше одного символа в длину это не представляет проблемы. Если необходимо использовать строку формата изображения с одним символом, букве должен предшествовать знак процента (%), чтобы указать, что спецификатор стандартного формата не должен использоваться.

DateTime theDate = DateTime.Parse("13 Apr 2019 08:00:30");
string result;
result = theDate.ToString("d");       // result = "13/04/2019"
result = theDate.ToString("%d");      // result = "13"
Использование String.Format

В статье генерация строк C# с помощью String.Format я описал использование метода String.Format для создания отформатированных строк, содержащих числовые данные. Этот метод также может использоваться для перевода значений DateTime в строки.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, DateTime, си шарп, работа с датой, Уроки по си шарп




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Заказ Стрибог на Java
Перебор всех дней в году на PHP
Что такое Selenium