Pull to refresh
935.87
OTUS
Цифровые навыки от ведущих экспертов

Работа со временем и датой в C# с применением библиотеки Humanizer

Reading time7 min
Views4.7K
Original author: Keyur

Введение

В предыдущей статье мы с вами разбирались, как работать с Humanizer — бесплатной .NET-библиотекой с открытым исходным кодом, которая предлагает набор методов расширения и утилит для форматирования и манипулирования строками, числами, датами, временем, временными интервалами, цифрами и величинами в удобном для человеческого восприятия виде. Мы увидели, как Humanizer может помочь нам преобразовать строки из верблюжьей нотации (camelCase) и стиля Pascal (PascalCase) в удобочитаемый текст, отформатировать числа и даты в приятный с точки зрения пользователя вид, а также преобразовать слова во множественное и единственное число.

Работа со временем и датой — одна из самых распространенных и муторных задач в любом приложении. Пользователи ожидают увидеть дату и время в формате, который будет легко восприниматься и соответствовать контексту. Например, пользователи хотели бы увидеть что-то вроде "2 часа назад" вместо "2023-12-01 12:14:53" или "завтра в 10:00 утра" вместо "2023-12-02 10:00:00". Кроме того, пользователи также могут иметь различные предпочтения в отношении форматов времени и даты в зависимости от их культуры, языка и местоположения.

Цель этой статьи — показать вам, как использовать Humanizer, чтобы вывести работу со временем и датой в ваших C#-проектах на новый уровень. Я расскажу о том, как преобразовать объекты DateTime и TimeSpan в удобный для восприятия человеком вид (в целях лаконичности далее мы будем использовать термин “гуманизировать”), как настраивать параметры гуманизации и как объединять гуманизацию строк со временеме/датой. Мы также рассмотрим некоторые реальные сценарии использования и примеры того, как Humanizer может улучшить пользовательский опыт в отношении времени и даты.

Гуманизация объектов DateTime

Объект DateTime представляет определенный момент времени, например текущее время и дату или время и дату в прошлом или будущем. Humanizer предоставляет несколько методов расширения для приведения объектов DateTime к удобочитаемому для человека формату.

Форматирование DateTime в удобочитаемый вид

Один из самых простых способов гуманизировать объект DateTime — использовать метод расширения Humanize, который возвращает строку, представляющую время и дату на естественном языке. Например:

using Humanizer;

DateTime now = DateTime.Now;
DateTime yesterday = now.AddDays(-1);
DateTime tomorrow = now.AddDays(1);
DateTime nextWeek = now.AddDays(7);

Console.WriteLine(now.Humanize()); // сейчас
Console.WriteLine(yesterday.Humanize()); // вчера
Console.WriteLine(tomorrow.Humanize()); // через 23 часа
Console.WriteLine(nextWeek.Humanize()); // через 6 дней

Как видите, метод Humanize возвращает строку, которая легко воспринимается и зависит от текущих времени и даты. Он также учитывает различные временные отношения, такие как сегодня, вчера, завтра, а также будущие или прошлые даты.

Отображение относительного времени (например, "2 часа назад")

Еще один способ гуманизации объекта DateTime — использовать метод расширения Humanize с булевым параметром, указывающим, отображать относительное время или нет. Относительное время — это строка, которая представляет, сколько времени прошло с или пройдет до конкретного момента. Например:

using Humanizer;

DateTime anHourAgo = DateTime.Now.AddHours(-1);
DateTime anHourLater = DateTime.Now.AddHours(1);

Console.WriteLine(anHourAgo.Humanize()); // час назад
Console.WriteLine(anHourLater.Humanize()); // через 59 минут

Как видите, относительное время полезно, когда нужно показать насколько близко или далеко те или иные время и дата от настоящего момента, а абсолютное время — когда нужно показать точную дату и время.

Параметры гуманизации DateTime

Humanizer также позволяет настраивать для объектов DateTime такие параметры гуманизации, как культура, точность, максимальная и минимальная единицы измерения. Вы можете использовать метод расширения Humanize с объектом HumanizeOptions, в котором указаны желаемые параметры. Например:

using System.Globalization;
using Humanizer;

DateTime now = DateTime.Now;
DateTime twoHoursAgo = now.AddHours(-2);

// Указываем другую культуру
Console.WriteLine(twoHoursAgo.Humanize(culture: new CultureInfo("fr-FR"))); // il y a 2 heures

Как видите, опция culture позволяет использовать для гуманизации строки другой язык и формат.

Гуманизация объектов TimeSpan

Объект TimeSpan представляет собой временной интервал, например, продолжительность события или разницу между двумя датами и временем. Humanizer предоставляет несколько методов расширения для гуманизации объектов TimeSpan в удобный для пользователя формат.

Преобразование TimeSpan в удобный для пользователя формат

Один из самых простых способов гуманизировать объект TimeSpan — использовать метод расширения Humanize, который возвращает строку, представляющую временной интервал на естественном языке. Например:

using Humanizer;

TimeSpan oneHour = TimeSpan.FromHours(1);
TimeSpan oneMinute = TimeSpan.FromMinutes(1);
TimeSpan oneSecond = TimeSpan.FromSeconds(1);
TimeSpan oneMillisecond = TimeSpan.FromMilliseconds(1);

Console.WriteLine(oneHour.Humanize()); // 1 час 
Console.WriteLine(oneMinute.Humanize()); // 1 минута 
Console.WriteLine(oneSecond.Humanize()); // 1 секунда
Console.WriteLine(oneMillisecond.Humanize()); // 1 миллисекунда

Как видите, метод Humanize возвращает строку, которая зависит от указанного временного интервала и легко воспринимается. Он также учитывает такие нюансы, как формы в единственном и множественном числе, а также неопределенные и определенные артикли.

Обработка длительностей (например, "2 дня, 5 часов и 30 минут")

Еще один способ гуманизации объекта TimeSpan — использовать метод расширения Humanize с параметром, указывающим отображаемую длительность временного интервала, т.е. мы можем указать с какой точностью будет выведен временной интервал. Например:

using Humanizer;

TimeSpan twoDays = TimeSpan.FromDays(2);
TimeSpan twoHours = TimeSpan.FromHours(2);
TimeSpan twoMinutes = TimeSpan.FromMinutes(2);
TimeSpan twoSeconds = TimeSpan.FromSeconds(2);
TimeSpan twoMilliseconds = TimeSpan.FromMilliseconds(2);

Console.WriteLine(twoDays.Humanize()); // 2 дня
Console.WriteLine(twoHours.Humanize()); // 2 часа
Console.WriteLine(twoMinutes.Humanize()); // 2 минуты
Console.WriteLine(twoSeconds.Humanize()); // 2 секунды
Console.WriteLine(twoMilliseconds.Humanize()); // 2 милисекунды

Как видите, работа с длительностью полезна, когда вы хотите показать конкретно количество единиц временного интервала, а ограничение до одной единицы — когда вы хотите показать только самую большую единицу временного интервала.

Параметры гуманизации TimeSpan

Humanizer также позволяет настраивать для объектов TimeSpan такие параметры гуманизации, как культура, точность, максимальная и минимальная единицы измерения. Вы можете использовать метод расширения Humanize с объектом HumanizeOptions, в котором будут указаны требуемые параметры:

using System.Globalization;
using Humanizer;
using Humanizer.Localisation;

TimeSpan twoDays = TimeSpan.FromDays(2.75);

// Указываем другую культуру 
Console.WriteLine(twoDays.Humanize(culture: new CultureInfo("fr-FR"))); // 2 часа

// Указываем другую точность
Console.WriteLine(twoDays.Humanize(precision: 3)); // 2 дня, 18 часов

// Указываем другую максимальную единицу измерения
Console.WriteLine(twoDays.Humanize(maxUnit: TimeUnit.Hour)); // 66 часов

// Указываем другую минимальную единицу измерения
Console.WriteLine(twoDays.Humanize(minUnit: TimeUnit.Minute)); // 2 дня

Как видите, параметр culture позволяет использовать для гуманизации строки другой язык и формат. Параметр precision позволяет указать, сколько единиц измерения времени включать в гуманизированную строку. Параметры max unit и min unit позволяют указать наибольшую и наименьшую единицы измерения времени.

Комбинирование гуманизации строк и DateTime

Humanizer позволяет гуманизировать строки и объекты даты/времени не только по отдельности, но и объединять их в единое целое. Вы можете использовать метод расширения Humanize со строкой, содержащей заполнители для объектов даты/времени, и Humanizer автоматически заменит их гуманизированными строками. Например.

using Humanizer;

DateTime now = DateTime.Now;
DateTime twoHoursAgo = now.AddHours(-2);

// Использование заполнителей для объектов даты/времени
Console.WriteLine("The current time is {0}", now.Humanize()); // Текущее время сейчас 
Console.WriteLine("The last update was {0}", twoHoursAgo.Humanize()); // Последнее обновление было 2 часа назад

Как видите, метод Humanize со строкой, содержащей заполнители для объектов даты/времени, позволяет комбинировать гуманизацию строки и даты/времени простым и элегантным способом. Вы можете использовать любое количество заполнителей и любой формат для объектов даты/времени, и Humanizer будет обрабатывать их соответствующим образом.

Реальные примеры использования

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

  • Сообщения в социальных сетях: Вы можете использовать Humanizer для отображения даты и времени сообщений в социальных сетях в относительном и удобном для человека виде, например "2 часа назад" или "вчера". Это поможет пользователям быстро понять, насколько давно было отправлено сообщение, тем самым немного облегчая себе жизнь.

  • Уведомления и напоминания: С помощью Humanizer вы можете отправлять пользователям уведомления и напоминания в естественной и удобной для пользователя форме, например "завтра в 10:00 утра" или "через 15 минут". Это поможет пользователям лучше запоминать и планировать свои задачи, а также избежать путаницы и ошибок.

  • Журналы и отчеты: С помощью Humanizer можно отформатировать дату и время в журналах и отчетах в удобочитаемом и последовательном виде, например "12/1/2023 4:14:53 PM" или "2 дня, 5 часов и 30 минут". Это поможет пользователям лучше анализировать и сравнивать данные, а также быстрее находить и устранять проблемы.

  • Календари и расписания: С помощью Humanizer можно отображать дату и время в календарях и расписаниях в ясном и четком виде, например "Понедельник, 1 декабря 2023 года" или "2 часа 30 минут". Это поможет пользователям лучше просматривать и управлять своими событиями, а также избегать конфликтов и накладок.

Заключение

В этой статье мы узнали, как использовать Humanizer для удобной работы с датой и временем в наших проектах на C#. Мы рассмотрели, как гуманизировать объекты DateTime и TimeSpan, как настраивать параметры гуманизации и как сочетать гуманизацию строк и даты/времени. Мы также рассмотрели некоторые реальные примеры использования и примеры того, как Humanizer может улучшить работу пользователей с датой и временем.

Humanizer — это мощная и универсальная библиотека, которая поможет вам форматировать и манипулировать строками, числами, датами, временем, временными интервалами, цифрами и величинами в удобном для человека виде. Она поможет вам сэкономить время и усилия, а также сделает ваш код более читаемым и удобным. Она также может улучшить пользовательский опыт и сделать ваши приложения более интересными и привлекательными.

Надеюсь, вам понравилась эта статья, и вы узнали что-то новое и полезное. Спасибо за внимание.

В заключение приглашаем на открытый урок «Базы данных: реляционные базы данных и работа с ними», записаться можно на странице онлайн-курса.

Tags:
Hubs:
Total votes 16: ↑12 and ↓4+8
Comments12

Articles

Information

Website
otus.ru
Registered
Founded
Employees
101–200 employees
Location
Россия
Representative
OTUS