โครงสร้าง TimeSpan มีค่าคงที่ (Constants) TicksPer* สำหรับแปลงหน่วยเวลาต่างๆ เป็น Ticks (1 Tick = 100 นาโนวินาที = 0.0001 มิลลิวินาที) ใช้ในการคำนวณเวลาอย่างแม่นยำระดับ Tick
ค่าคงที่ TicksPer ทั้งหมด
| ค่าคงที่ | ค่า | คำอธิบาย |
|---|---|---|
TimeSpan.TicksPerMillisecond | 10,000 | 1 มิลลิวินาที = 10,000 Ticks |
TimeSpan.TicksPerSecond | 10,000,000 | 1 วินาที = 10 ล้าน Ticks |
TimeSpan.TicksPerMinute | 600,000,000 | 1 นาที = 600 ล้าน Ticks |
TimeSpan.TicksPerHour | 36,000,000,000 | 1 ชั่วโมง = 36 พันล้าน Ticks |
TimeSpan.TicksPerDay | 864,000,000,000 | 1 วัน = 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 (%) เพื่อแยกหน่วยแต่ละระดับ