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

ค่าคงที่ TicksPer ใน C# TimeSpan: การแปลงหน่วยเวลาเป็น Ticks

โครงสร้าง TimeSpan มีค่าคงที่ (Constants) TicksPer* สำหรับแปลงหน่วยเวลาต่างๆ เป็น Ticks (1 Tick = 100 นาโนวินาที = 0.0001 มิลลิวินาที) ใช้ในการคำนวณเวลาอย่างแม่นยำระดับ Tick

ค่าคงที่ TicksPer ทั้งหมด

ค่าคงที่ค่าคำอธิบาย
TimeSpan.TicksPerMillisecond10,0001 มิลลิวินาที = 10,000 Ticks
TimeSpan.TicksPerSecond10,000,0001 วินาที = 10 ล้าน Ticks
TimeSpan.TicksPerMinute600,000,0001 นาที = 600 ล้าน Ticks
TimeSpan.TicksPerHour36,000,000,0001 ชั่วโมง = 36 พันล้าน Ticks
TimeSpan.TicksPerDay864,000,000,0001 วัน = 864 พันล้าน Ticks

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

using System;

public class Demo
{
    public static void Main()
    {
        Console.WriteLine("=== ค่าคงที่ TicksPer ===");
        Console.WriteLine($"TicksPerMillisecond: {TimeSpan.TicksPerMillisecond:N0}");
        Console.WriteLine($"TicksPerSecond:      {TimeSpan.TicksPerSecond:N0}");
        Console.WriteLine($"TicksPerMinute:      {TimeSpan.TicksPerMinute:N0}");
        Console.WriteLine($"TicksPerHour:        {TimeSpan.TicksPerHour:N0}");
        Console.WriteLine($"TicksPerDay:         {TimeSpan.TicksPerDay:N0}");
        
        Console.WriteLine("\n=== การแปลงหน่วยเวลาเป็น Ticks ===");
        // แปลงหน่วยต่างๆ เป็น Ticks
        long ms = 500 * TimeSpan.TicksPerMillisecond;      // 500 ms
        long sec = 30 * TimeSpan.TicksPerSecond;           // 30 วินาที
        long min = 5 * TimeSpan.TicksPerMinute;            // 5 นาที
        long hr = 2 * TimeSpan.TicksPerHour;               // 2 ชั่วโมง
        long day = 1 * TimeSpan.TicksPerDay;               // 1 วัน
        
        Console.WriteLine($"500 ms   = {ms:N0} ticks");
        Console.WriteLine($"30 วินาที = {sec:N0} ticks");
        Console.WriteLine($"5 นาที   = {min:N0} ticks");
        Console.WriteLine($"2 ชั่วโมง = {hr:N0} ticks");
        Console.WriteLine($"1 วัน     = {day:N0} ticks");
        
        Console.WriteLine("\n=== การสร้าง TimeSpan จาก Ticks ===");
        TimeSpan fromTicks = new TimeSpan(500 * TimeSpan.TicksPerMillisecond);
        Console.WriteLine($"500 ms = {fromTicks}"); // 00:00:00.5000000
        
        TimeSpan oneDay = new TimeSpan(TimeSpan.TicksPerDay);
        Console.WriteLine($"1 วัน = {oneDay}"); // 1.00:00:00
        
        Console.WriteLine("\n=== การคำนวณย้อนกลับ (Ticks → หน่วยเวลา) ===");
        long totalTicks = 9876543210; // ประมาณ 1.646 นาที
        
        long days = totalTicks / TimeSpan.TicksPerDay;
        long hours = (totalTicks % TimeSpan.TicksPerDay) / TimeSpan.TicksPerHour;
        long minutes = (totalTicks % TimeSpan.TicksPerHour) / TimeSpan.TicksPerMinute;
        long seconds = (totalTicks % TimeSpan.TicksPerMinute) / TimeSpan.TicksPerSecond;
        long msRemain = (totalTicks % TimeSpan.TicksPerSecond) / TimeSpan.TicksPerMillisecond;
        
        Console.WriteLine($"Ticks: {totalTicks:N0}");
        Console.WriteLine($"แปลง: {days} วัน {hours} ชม. {minutes} นาที {seconds} วินาที {msRemain} มิลลิวินาที");
        
        // วิธีง่ายกว่า: ใช้ TimeSpan.FromTicks
        TimeSpan ts = TimeSpan.FromTicks(totalTicks);
        Console.WriteLine($"TimeSpan.FromTicks: {ts}");
    }
}

ผลลัพธ์

=== ค่าคงที่ TicksPer ===
TicksPerMillisecond: 10,000
TicksPerSecond:      10,000,000
TicksPerMinute:      600,000,000
TicksPerHour:        36,000,000,000
TicksPerDay:         864,000,000,000

=== การแปลงหน่วยเวลาเป็น Ticks ===
500 ms   = 5,000,000 ticks
30 วินาที = 300,000,000 ticks
5 นาที   = 3,000,000,000 ticks
2 ชั่วโมง = 72,000,000,000 ticks
1 วัน     = 864,000,000,000 ticks

=== การสร้าง TimeSpan จาก Ticks ===
500 ms = 00:00:00.5000000
1 วัน = 1.00:00:00

=== การคำนวณย้อนกลับ (Ticks → หน่วยเวลา) ===
Ticks: 9,876,543,210
แปลง: 0 วัน 2 ชม. 44 นาที 36 วินาที 543 มิลลิวินาที
TimeSpan.FromTicks: 02:44:36.5432100

ความสัมพันธ์กับ DateTime.Ticks

// DateTime.Ticks เริ่มนับจาก 00:00:00 UTC, January 1, Year 1
// TimeSpan.Ticks เริ่มนับจาก 0 (Duration)

DateTime dt = new DateTime(2024, 1, 1);
Console.WriteLine($"DateTime.Ticks: {dt.Ticks:N0}"); // 638407680000000000

// ความต่างของ DateTime 2 ค่า = TimeSpan
DateTime dt1 = DateTime.Now;
DateTime dt2 = DateTime.Now.AddHours(1);
TimeSpan diff = dt2 - dt1;
Console.WriteLine($"ความต่างใน Ticks: {diff.Ticks:N0}"); // 36,000,000,000 = TicksPerHour

การใช้งานจริง: High-Precision Timing

public class HighPrecisionTimer
{
    private long _startTicks;
    
    public void Start() => _startTicks = DateTime.UtcNow.Ticks;
    
    public TimeSpan Elapsed => new TimeSpan(DateTime.UtcNow.Ticks - _startTicks);
    
    public long ElapsedMicroseconds => (DateTime.UtcNow.Ticks - _startTicks) / 10; // 1 tick = 0.1 μs
}

// ใช้งาน
var timer = new HighPrecisionTimer();
timer.Start();
// ... โค้ดที่ต้องการวัด ...
Console.WriteLine($"ใช้เวลา: {timer.ElapsedMicroseconds} ไมโครวินาที");

ข้อควรระวัง

  • 1 Tick = 100 นาโนวินาที (ไม่ใช่ 1 นาโนวินาที)
  • Stopwatch.ElapsedTicks ใช้ Frequency ของ Hardware (ไม่เท่ากับ TimeSpan.TicksPerSecond)
  • ใช้ TimeSpan.FromTicks() สร้าง TimeSpan จาก Ticks ได้โดยตรง
  • การคำนวณย้อนกลับควรใช้ Modulo (%) เพื่อแยกหน่วยแต่ละระดับ