نحوه نمایش زمان نسبی در C#
![](https://media.hapigan.com/avatars/3080afdd90724629854cefe03bef62ef.webp)
فرض کنیم نیاز داریم زمان را در قالبهایی نسبی مانند "2 ساعت پیش" به کاربر نمایش دهیم. برای این کار باید از محاسبه زمان گذشته برای نمایش زمان استفاده کنیم.
برای شروع، با تعیین یک متغیر TimeSpan
که تفاوت زمانی بین زمان فعلی و زمان مدنظر را محاسبه میکند، میتوانیم از کد زیر استفاده کنیم:
var ts = new TimeSpan(DateTime.UtcNow.Ticks - yourDate.Ticks);
double delta = Math.Abs(ts.TotalSeconds);
یا اگر دو زمان را از هم کم کنیم یک TimeSpan باز می گرداند:
var ts = DateTime.UtcNow- yourDate;
double delta = Math.Abs(ts.TotalSeconds);
سپس بر اساس مقدار delta
، میتوانیم ساختارهای شرطی را برای نمایش زمان نسبی ایجاد کنیم. در زیر یک مثال کامل از این محاسبات ارائه میشود:
const int SECOND = 1;
const int MINUTE = 60 * SECOND;
const int HOUR = 60 * MINUTE;
const int DAY = 24 * HOUR;
const int MONTH = 30 * DAY;
if (delta < 1 * MINUTE)
return ts.Seconds == 1 ? "یک ثانیه پیش" : ts.Seconds + " ثانیه پیش";
if (delta < 2 * MINUTE)
return "یک دقیقه پیش";
if (delta < 45 * MINUTE)
return ts.Minutes + " دقیقه پیش";
if (delta < 90 * MINUTE)
return "یک ساعت پیش";
if (delta < 24 * HOUR)
return ts.Hours + " ساعت پیش";
if (delta < 48 * HOUR)
return "دیروز";
if (delta < 30 * DAY)
return ts.Days + " روز پیش";
if (delta < 12 * MONTH)
{
int months = Convert.ToInt32(Math.Floor((double)ts.Days / 30));
return months <= 1 ? "یک ماه پیش" : months + " ماه پیش";
}
else
{
int years = Convert.ToInt32(Math.Floor((double)ts.Days / 365));
return years <= 1 ? "یک سال پیش" : years + " سال پیش";
}
استفاده از کتابخانه Humanizer
کتابخانه Humanizer امکان نمایش داده های مختلف در قالب رشته به صورتی که فهم انسان را از آنها بالاتر ببرد دارد. یکی از کاربردهای این کتابخانه تبدیل زمان و نمایش زمان نسبی است:
DateTime.UtcNow.AddHours(-30).Humanize() => "yesterday"
DateTime.UtcNow.AddHours(-2).Humanize() => "2 hours ago"
DateTime.UtcNow.AddHours(30).Humanize() => "tomorrow"
DateTime.UtcNow.AddHours(2).Humanize() => "2 hours from now"
DateTimeOffset.UtcNow.AddHours(1).Humanize() => "an hour from now"
یکی از قابلیت های خوب این کتابخانه امکان استفاده با زبان ها و فرهنگ های مختلف است.
// به عربی
DateTime.UtcNow.AddDays(-1).Humanize() => "أمس"
DateTime.UtcNow.AddDays(-2).Humanize() => "منذ يومين"
DateTime.UtcNow.AddDays(-3).Humanize() => "منذ 3 أيام"
DateTime.UtcNow.AddDays(-11).Humanize() => "منذ 11 يوم"
// روسی
DateTime.UtcNow.AddMinutes(-1).Humanize() => "минуту назад"
DateTime.UtcNow.AddMinutes(-2).Humanize() => "2 минуты назад"
DateTime.UtcNow.AddMinutes(-10).Humanize() => "10 минут назад"
DateTime.UtcNow.AddMinutes(-21).Humanize() => "21 минуту назад"
DateTime.UtcNow.AddMinutes(-22).Humanize() => "22 минуты назад"
DateTime.UtcNow.AddMinutes(-40).Humanize() => "40 минут назад"
نمایش زمان در کلاینت
اگر سمت کلاینت و در براوزر بخواهیم این کار را انجام دهیم میتوانی از کتابخانههای خارجی مانند jquery.timeago
استفاده کنیم :
jQuery(document).ready(function() {
jQuery('abbr.timeago').timeago();
});
بدین ترتیب، با استفاده از کد بالا و تکنیکهای اضافی مانند کتابخانههای جاوا اسکریپت، میتوانیم زمانهای نسبی را به صورت مؤثر و کاربرپسند نمایش دهیم.