Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

การลบ TimeSpan สองค่าใน C# ด้วยเมธอด Subtract()

เมธอด Subtract() ของ TimeSpan ใช้ลบช่วงเวลาอีกช่วงหนึ่งออก คืนค่า TimeSpan ใหม่ที่เป็นผลต่าง (Immutable) เหมาะสำหรับคำนวณระยะเวลาที่เหลือ หรือความต่างของเวลา

รูปแบบการใช้งาน

TimeSpan t1 = TimeSpan.FromHours(2);
TimeSpan t2 = TimeSpan.FromMinutes(30);
TimeSpan result = t1.Subtract(t2); // 1 ชั่วโมง 30 นาที

โค้ดตัวอย่างสมบูรณ์

using System;

public class Demo
{
    public static void Main()
    {
        TimeSpan t1 = TimeSpan.FromMinutes(2);  // 2 นาที
        TimeSpan t2 = TimeSpan.FromMinutes(1);  // 1 นาที
        
        Console.WriteLine($"TimeSpan แรก:  {t1}");
        Console.WriteLine($"TimeSpan ที่สอง: {t2}");
        
        // ลบด้วยเมธอด Subtract()
        TimeSpan result = t1.Subtract(t2);
        Console.WriteLine($"ผลต่าง (Subtract): {result}"); // 00:01:00
        
        // ลบด้วย Operator - (สะดวกกว่า)
        TimeSpan result2 = t1 - t2;
        Console.WriteLine($"ผลต่าง (-):      {result2}"); // 00:01:00
        
        // ตัวอย่าง: คำนวณเวลาที่เหลือ
        Console.WriteLine("\n--- คำนวณเวลาที่เหลือ ---");
        TimeSpan totalTime = TimeSpan.FromHours(8);      // เวลาทำงาน 8 ชม.
        TimeSpan worked = TimeSpan.FromHours(3).Add(TimeSpan.FromMinutes(45)); // ทำงานไป 3:45
        TimeSpan remaining = totalTime.Subtract(worked);
        
        Console.WriteLine($"เวลาทำงานทั้งหมด: {totalTime}");
        Console.WriteLine($"ทำงานไปแล้ว:     {worked}");
        Console.WriteLine($"เหลือ:           {remaining}"); // 04:15:00
        
        // ตัวอย่าง: ความต่างของวันที่ (DateTime - DateTime = TimeSpan)
        Console.WriteLine("\n--- ความต่างของ DateTime ---");
        DateTime start = new DateTime(2024, 1, 1, 9, 0, 0);
        DateTime end = new DateTime(2024, 1, 1, 17, 30, 0);
        TimeSpan duration = end.Subtract(start); // หรือ end - start
        
        Console.WriteLine($"เริ่ม: {start:HH:mm}");
        Console.WriteLine($"สิ้นสุด: {end:HH:mm}");
        Console.WriteLine($"ระยะเวลา: {duration}"); // 08:30:00
    }
}

ผลลัพธ์

TimeSpan แรก:  00:02:00
TimeSpan ที่สอง: 00:01:00
ผลต่าง (Subtract): 00:01:00
ผลต่าง (-):      00:01:00

--- คำนวณเวลาที่เหลือ ---
เวลาทำงานทั้งหมด: 08:00:00
ทำงานไปแล้ว:     03:45:00
เหลือ:           04:15:00

--- ความต่างของ DateTime ---
เริ่ม: 09:00
สิ้นสุด: 17:30
ระยะเวลา: 08:30:00

เมธอดคำนวณ TimeSpan ทั้งหมด

การดำเนินการเมธอดOperatorคำอธิบาย
บวกAdd()+รวมระยะเวลา
ลบSubtract()-ความต่างของระยะเวลา
คูณMultiply(double) (.NET 6+)-ขยายระยะเวลา
หารDivide(double) (.NET 6+)-แบ่งระยะเวลา
NegateNegate()- (Unary)กลับเครื่องหมาย
DurationDuration()-ค่าสัมบูรณ์ (Absolute value)

การใช้งานจริง: Pomodoro Timer

public class PomodoroTimer
{
    private readonly TimeSpan _workTime = TimeSpan.FromMinutes(25);
    private readonly TimeSpan _breakTime = TimeSpan.FromMinutes(5);
    private TimeSpan _remaining;
    private bool _isWorkPeriod;
    
    public void StartWork() 
    { 
        _remaining = _workTime; 
        _isWorkPeriod = true; 
    }
    
    public void Tick(TimeSpan elapsed)
    {
        _remaining = _remaining.Subtract(elapsed);
        if (_remaining <= TimeSpan.Zero)
        {
            _isWorkPeriod = !_isWorkPeriod;
            _remaining = _isWorkPeriod ? _workTime : _breakTime;
            OnPeriodChanged?.Invoke(_isWorkPeriod, _remaining);
        }
    }
    
    public event Action OnPeriodChanged;
}

ข้อควรระวัง

  • TimeSpan เป็น Immutable - Subtract() คืนค่าใหม่ ไม่เปลี่ยนตัวเดิม
  • ใช้ Operator - แทน Subtract() เพื่อความอ่านง่าย
  • ผลลัพธ์อาจเป็นลบ (Negative TimeSpan) หากลบค่ามากกว่า - ใช้ Duration() เพื่อค่าสัมบูรณ์
  • DateTime - DateTime = TimeSpan - ใช้คำนวณระยะเวลาระหว่างจุดเวลา
  • สำหรับ .NET 6+ ใช้ Multiply/Divide แทนการคูณ/หาร Ticks เอง