© 2020, Developed by Hieu Dev

Hàm định dạng ngày giờ giống Facebook bằng C# .NET hoặc SQL Sever

Hôm nay, mình sẽ chia sẻ các bạn hàm C# và SQL Server nhỏ sẽ trả về giá trị ngày giờ theo cách giống facebook, twitter, stack overflow và hầu hết các trang diễn đàn, cụ thể như 1 ngày trước, 1 phút trước,...


Mình sẽ giới thiệu đến các bạn hai cách đơn giản nhất để tạo định dạng ngày giờ bằng cách sử dụng C# .NET và SQL Server:

Sử dụng hàm static trong C# .NET

Một cách đơn giản nhất là các bạn sử dụng switch case sau đây:

public static string TimeAgo(this DateTime dateTime)
{
    string result = string.Empty;
    var timeSpan = DateTime.Now.Subtract(dateTime);

    if (timeSpan <= TimeSpan.FromSeconds(60))
    {
        result = string.Format("{0} seconds ago", timeSpan.Seconds);
    }
    else if (timeSpan <= TimeSpan.FromMinutes(60))
    {
        result = timeSpan.Minutes > 1 ? 
            String.Format("about {0} minutes ago", timeSpan.Minutes) :
            "about a minute ago";
    }
    else if (timeSpan <= TimeSpan.FromHours(24))
    {
        result = timeSpan.Hours > 1 ? 
            String.Format("about {0} hours ago", timeSpan.Hours) : 
            "about an hour ago";
    }
    else if (timeSpan <= TimeSpan.FromDays(30))
    {
        result = timeSpan.Days > 1 ? 
            String.Format("about {0} days ago", timeSpan.Days) : 
            "yesterday";
    }
    else if (timeSpan <= TimeSpan.FromDays(365))
    {
        result = timeSpan.Days > 30 ? 
            String.Format("about {0} months ago", timeSpan.Days / 30) : 
            "about a month ago";
    }
    else
    {
        result = timeSpan.Days > 365 ? 
            String.Format("about {0} years ago", timeSpan.Days / 365) : 
            "about a year ago";
    }

    return result;
}


Hiển thị thời gian tương đối là một lựa chọn tốt. Các trang mạng xã hội như Facebook và Twitter sử dụng một chức năng đơn giản cho phép chúng hiển thị thời gian tương đối. Điều này có thể được sử dụng cho các nhận xét và các thông tin liên lạc khác để cho biết thời gian trước thay vì thời gian chính xác có thể không chính xác với một số người ở múi giờ khác.

Tạo hàm Scalar Function trong SQL Server

Đây là cách tạo ngày giờ tương đối trong SQL Server bằng cách tạo hàm vô hướng (Scalar Function):

ALTER FUNCTION FormatDateLikeFacebook
(
	@datetime DATETIME
)
RETURNS NVARCHAR(100)
AS
BEGIN
	DECLARE @timeago NUMERIC(10) = DATEDIFF(second,{d '1970-01-01'}, @datetime)
	DECLARE @current_time NUMERIC(10) = DATEDIFF(second,{d '1970-01-01'}, GETDATE())
	DECLARE @time_difference NUMERIC(10) = @current_time - @timeago
	DECLARE @seconds NUMERIC(10) = @time_difference
	DECLARE @minutes NUMERIC(10) = ROUND(@seconds / 60, 0)
	DECLARE @hours NUMERIC(10) = ROUND(@seconds/ 3600, 0)
	DECLARE @days NUMERIC(10) = ROUND(@seconds/86400, 0)
	DECLARE @weeks NUMERIC(10) = ROUND(@seconds/604800, 0)
	DECLARE @months NUMERIC(10) = ROUND(@seconds/2629440, 0)
	DECLARE @years NUMERIC(10) = ROUND(@seconds/31553280, 0)

	IF @seconds <= 60
		RETURN N'Vừa mới đăng.'
	ELSE IF @minutes<=60
		BEGIN
			IF @minutes = 1
				RETURN N'Cách đây 1 phút.'
			ELSE
                RETURN CONCAT(N'Cách đây ', @minutes, N' phút.')
		END	
	ELSE IF @hours<=24
		BEGIN
			IF @hours = 1
				RETURN N'Cách đây 1 giờ.'
			ELSE
                RETURN CONCAT(N'Cách đây ', @hours, N' giờ.')
		END	
	ELSE IF @days<= 7
		BEGIN
			IF @days = 1
				RETURN N'Ngày hôm qua.'
			ELSE
                RETURN CONCAT(N'Cách đây ', @days, N' ngày.')
		END	
	ELSE IF @weeks<= 4.3
		BEGIN
			IF @weeks = 1
				RETURN N'Cách đây 1 tuần.'
			ELSE
                RETURN CONCAT(N'Cách đây ', @weeks, ' tuần.')
		END	
	ELSE IF @months<= 12
		BEGIN
			IF @months = 1
				RETURN N'Cách đây 1 tháng.'
			ELSE
                RETURN CONCAT(N'Cách đây ', @months, N' tháng.')
		END	
	ELSE 
		BEGIN
			IF @years =1
				RETURN N'Cách đây 1 năm.'
			ELSE
                RETURN CONCAT(N'Cách đây ', @years, N' năm.')
		END	

	RETURN ''

END


Và đây là cách đơn giản nhất để tạo ngày giờ tương đối, mong bài viết có ích với bạn, chúc các bạn thành công!

Hiếu Quốc.

2 Nhận xét

Mới hơn Cũ hơn