วิธีการคำนวณ เวลาเชิงสัมพันธ์ ใน C#

เมื่อทำงานกับวันที่และเวลาใน C# คุณอาจพบว่าจำเป็นต้องแสดงว่ามีเวลาผ่านไปนานเท่าไหร่ตั้งแต่เกิดเหตุการณ์หนึ่งเหตุการณ์ การแสดงเวลาในรูปแบบที่เข้าใจง่าย เช่น “2 ชั่วโมงที่แล้ว” หรือ “เมื่อวานนี้” สามารถทำให้ผู้ใช้มีประสบการณ์ที่ดีขึ้น ในโพสต์นี้ เราจะสำรวจวิธีการนำฟังก์ชันนี้ไปใช้โดยใช้คลาส DateTime และ TimeSpan ใน C#

แนวคิดของเวลาเชิงสัมพันธ์

เวลาเชิงสัมพันธ์หมายถึงการแสดงเวลาที่ผ่านไปตั้งแต่เกิดเหตุการณ์หนึ่งในลักษณะที่เข้าใจได้ง่าย แทนที่จะโชว์เวลาแบบแน่นอน การแสดงเวลาเช่น “3 วันที่แล้ว” หรือ “เมื่อวาน” จะทำให้ผู้ใช้เข้าใจเวลาที่ผ่านมาได้ง่ายโดยไม่ต้องทำการคำนวณด้วยตนเอง

การนำเวลาเชิงสัมพันธ์ไปใช้ใน C#

นี่คือวิธีการคำนวณเวลาเชิงสัมพันธ์โดยใช้ค่า DateTime ใน C#:

ขั้นตอนที่ 1: กำหนดค่าคงที่สำหรับช่วงเวลา

ก่อนอื่นคุณต้องตั้งค่าคงที่ที่แทนช่วงเวลาที่แตกต่างกัน ซึ่งจะทำให้โค้ดของคุณสะอาดและเข้าใจง่ายขึ้น

const int SECOND = 1;
const int MINUTE = 60 * SECOND;
const int HOUR = 60 * MINUTE;
const int DAY = 24 * HOUR;
const int MONTH = 30 * DAY;

ขั้นตอนที่ 2: คำนวณ TimeSpan

เพื่อที่จะกำหนดว่าเวลาผ่านไปนานเท่าไหร่ ให้คำนวณ TimeSpan ระหว่างเวลาปัจจุบันและ DateTime ที่กำหนด

var ts = new TimeSpan(DateTime.UtcNow.Ticks - yourDate.Ticks);
double delta = Math.Abs(ts.TotalSeconds);

ขั้นตอนที่ 3: กำหนดรูปแบบเวลาที่เหมาะสม

เมื่อคุณคำนวณ TimeSpan แล้ว คุณสามารถกำหนดวิธีการจัดรูปแบบเวลาเชิงสัมพันธ์โดยการใช้คำสั่งเงื่อนไข

นี่คือวิธีที่คุณสามารถคืนค่าสตริงที่เหมาะสมตามช่วงเวลาแตกต่าง ๆ:

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 + " ปีที่แล้ว";
}

ข้อคิดสุดท้าย

โค้ดข้างต้นช่วยให้คุณสามารถคำนวณและแสดงเวลาเชิงสัมพันธ์ได้อย่างมีประสิทธิภาพ เมื่อคุณนำสิ่งนี้ไปใช้ในแอปพลิเคชัน C# ของคุณ คุณสามารถปรับปรุงการใช้งานโดยทำให้การอ้างอิงวันที่เป็นที่เข้าใจได้มากขึ้นสำหรับผู้ใช้

ตอนนี้คุณพร้อมที่จะใช้วิธีการที่ใช้งานได้จริงในการเพิ่มการแสดงผลเวลาเชิงสัมพันธ์ในแอปพลิเคชันของคุณแล้ว สนุกกับการเขียนโค้ด!