เมธอด 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+) | - | แบ่งระยะเวลา |
| Negate | Negate() | - (Unary) | กลับเครื่องหมาย |
| Duration | Duration() | - | ค่าสัมบูรณ์ (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 เอง