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

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

เมธอด Add() ของโครงสร้าง TimeSpan ใช้บวกช่วงเวลาสองช่วงเข้าด้วยกัน คืนค่า TimeSpan ใหม่ที่เป็นผลรวม ไม่เปลี่ยนค่าเดิม (Immutable)

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

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

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

using System;

public class Demo
{
    public static void Main()
    {
        // สร้าง TimeSpan จากหน่วยต่างๆ
        TimeSpan t1 = TimeSpan.FromMinutes(1);   // 1 นาที
        TimeSpan t2 = TimeSpan.FromMinutes(2);   // 2 นาที
        
        Console.WriteLine($"TimeSpan แรก:  {t1}");
        Console.WriteLine($"TimeSpan ที่สอง: {t2}");
        
        // บวกด้วยเมธอด Add()
        TimeSpan result = t1.Add(t2);
        Console.WriteLine($"ผลรวม (Add): {result}"); // 00:03:00
        
        // บวกด้วย Operator + (สะดวกกว่า)
        TimeSpan result2 = t1 + t2;
        Console.WriteLine($"ผลรวม (+):   {result2}"); // 00:03:00
        
        // ตัวอย่างซับซ้อนกว่า
        Console.WriteLine("\n--- ตัวอย่างการบวกหลายช่วงเวลา ---");
        TimeSpan workTime = TimeSpan.FromHours(8);
        TimeSpan breakTime = TimeSpan.FromMinutes(45);
        TimeSpan overtime = TimeSpan.FromHours(2);
        
        TimeSpan totalWork = workTime.Add(breakTime).Add(overtime);
        Console.WriteLine($"เวลาทำงาน: {workTime}");
        Console.WriteLine($"พัก: {breakTime}");
        Console.WriteLine($"โอที: {overtime}");
        Console.WriteLine($"รวม: {totalWork}"); // 10:45:00
        
        // การบวกหลายรายการด้วย LINQ
        TimeSpan[] periods = 
        {
            TimeSpan.FromHours(1),
            TimeSpan.FromMinutes(30),
            TimeSpan.FromSeconds(45),
            TimeSpan.FromMilliseconds(500)
        };
        
        TimeSpan sum = periods.Aggregate(TimeSpan.Zero, (acc, ts) => acc.Add(ts));
        Console.WriteLine($"\nผลรวมจากอาร์เรย์: {sum}"); // 01:30:45.5000000
    }
}

ผลลัพธ์

TimeSpan แรก:  00:01:00
TimeSpan ที่สอง: 00:02:00
ผลรวม (Add): 00:03:00
ผลรวม (+):   00:03:00

--- ตัวอย่างการบวกหลายช่วงเวลา ---
เวลาทำงาน: 08:00:00
พัก: 00:45:00
โอที: 02:00:00
รวม: 10:45:00

ผลรวมจากอาร์เรย์: 01:30:45.5000000

เมธอดที่เกี่ยวข้องกับการคำนวณ TimeSpan

เมธอด/Operatorคำอธิบายตัวอย่าง
Add(TimeSpan)บวก TimeSpan อีกตัวหนึ่งt1.Add(t2)
+ (Operator)บวก TimeSpan (Syntax สะดวกกว่า)t1 + t2
Subtract(TimeSpan)ลบ TimeSpan อีกตัวหนึ่งt1.Subtract(t2)
- (Operator)ลบ TimeSpant1 - t2
Negate()ค่าตรงข้าม (Negative)ts.Negate()
Multiply(double)คูณด้วยตัวเลข (.NET 6+)ts.Multiply(2.5)
Divide(double)หารด้วยตัวเลข (.NET 6+)ts.Divide(2)

การใช้งานจริง: คำนวณเวลาทำงานรวม

public class WorkTimeCalculator
{
    private readonly List _periods = new();
    
    public void AddPeriod(TimeSpan period) => _periods.Add(period);
    
    public TimeSpan GetTotalTime() => 
        _periods.Aggregate(TimeSpan.Zero, (sum, ts) => sum.Add(ts));
    
    public TimeSpan GetAverageTime() => 
        _periods.Count > 0 
            ? TimeSpan.FromTicks(_periods.Sum(ts => ts.Ticks) / _periods.Count)
            : TimeSpan.Zero;
}

// ใช้งาน
var calc = new WorkTimeCalculator();
calc.AddPeriod(TimeSpan.FromHours(8));
calc.AddPeriod(TimeSpan.FromHours(7.5));
calc.AddPeriod(TimeSpan.FromHours(8.25));

Console.WriteLine($"รวม: {calc.GetTotalTime()}");     // 23:45:00
Console.WriteLine($"เฉลี่ย: {calc.GetAverageTime()}"); // 07:55:00

ข้อควรระวัง

  • TimeSpan เป็น Immutable - Add() คืนค่าใหม่ ไม่เปลี่ยนตัวเดิม
  • ใช้ Operator + แทน Add() เพื่อความอ่านง่าย
  • ผลลัพธ์อาจเกิน TimeSpan.MaxValue (ประมาณ 10 ล้านวัน) → โยน OverflowException
  • สำหรับการบวกหลายค่า ใช้ Aggregate(TimeSpan.Zero, (a, b) => a + b) หรือ LINQ Sum() (ต้องแปลงเป็น Ticks ก่อน)