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

วิธีดึง Unix Timestamp ใน C#

Unix Timestamp คืออะไร

Unix Timestamp (หรือ Unix Time / POSIX Time) คือจำนวนวินาทีที่ผ่านไปตั้งแต่ Unix Epoch: 1 มกราคม 1970 00:00:00 UTC ไม่รวม Leap Seconds

  • ใช้กันทั่วไปในระบบ Unix/Linux, Database, API, Logging
  • เป็น Integer (32-bit หรือ 64-bit) จัดการง่าย ไม่มี Timezone issue
  • Year 2038 Problem: 32-bit signed integer หมดอายุ 19 มกราคม 2038 (ใช้ int64 แทน)

วิธีที่ 1: DateTime.Now.Subtract() (Classic)

using System;

class Program
{
    static void Main()
    {
        // Local time → Unix timestamp (อาจมี timezone issue)
        int unixTimestamp = (int)(DateTime.Now.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
        Console.WriteLine($"Unix Timestamp (Local): {unixTimestamp}");
        
        // UTC version (แนะนำ)
        int utcTimestamp = (int)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
        Console.WriteLine($"Unix Timestamp (UTC): {utcTimestamp}");
    }
}

วิธีที่ 2: DateTimeOffset.ToUnixTimeSeconds() (แนะนำ .NET 4.6+)

using System;

class Program
{
    static void Main()
    {
        // DateTimeOffset รองรับ Offset/Timezone ได้ถูกต้อง
        long unixTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
        Console.WriteLine($"Unix Timestamp (UTC): {unixTimestamp}");
        
        // จาก DateTimeOffset ที่มี Offset
        var dto = new DateTimeOffset(2024, 1, 15, 10, 30, 0, TimeSpan.Zero);
        long timestamp = dto.ToUnixTimeSeconds();
        Console.WriteLine($"Specific date: {timestamp}");
        
        // Milliseconds precision
        long msTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
        Console.WriteLine($"Milliseconds: {msTimestamp}");
    }
}

วิธีที่ 3: TimeSpan Calculation

using System;

class Program
{
    static void Main()
    {
        var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
        var now = DateTime.UtcNow;
        var span = now - epoch;
        int unixTimestamp = (int)span.TotalSeconds;
        Console.WriteLine($"Unix Timestamp: {unixTimestamp}");
    }
}

แปลง Unix Timestamp กลับเป็น DateTime

using System;

class Program
{
    static void Main()
    {
        long timestamp = 1705312200;  // 2024-01-15 10:30:00 UTC
        
        // จาก UTC
        DateTime utcDateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).UtcDateTime;
        Console.WriteLine($"UTC: {utcDateTime:yyyy-MM-dd HH:mm:ss}");
        
        // จาก Local Time
        DateTime localDateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).LocalDateTime;
        Console.WriteLine($"Local: {localDateTime:yyyy-MM-dd HH:mm:ss}");
        
        // DateTimeOffset (เก็บ Offset ไว้)
        DateTimeOffset dto = DateTimeOffset.FromUnixTimeSeconds(timestamp);
        Console.WriteLine($"DateTimeOffset: {dto}");
    }
}

ตัวอย่างสมบูรณ์: Helper Class

using System;

public static class UnixTime
{
    private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    
    public static long Now => DateTimeOffset.UtcNow.ToUnixTimeSeconds();
    public static long NowMs => DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
    
    public static long ToUnixTime(this DateTime dateTime)
    {
        // Assume UTC if Unspecified
        var kind = dateTime.Kind == DateTimeKind.Unspecified ? DateTimeKind.Utc : dateTime.Kind;
        var dto = new DateTimeOffset(dateTime, kind == DateTimeKind.Utc ? TimeSpan.Zero : TimeZoneInfo.Local.GetUtcOffset(dateTime));
        return dto.ToUnixTimeSeconds();
    }
    
    public static DateTime FromUnixTime(long timestamp)
    {
        return DateTimeOffset.FromUnixTimeSeconds(timestamp).UtcDateTime;
    }
    
    public static DateTime FromUnixTimeMs(long timestampMs)
    {
        return DateTimeOffset.FromUnixTimeMilliseconds(timestampMs).UtcDateTime;
    }
}

// Usage
class Program
{
    static void Main()
    {
        Console.WriteLine($"Now: {UnixTime.Now}");
        Console.WriteLine($"Now ms: {UnixTime.NowMs}");
        
        var dt = DateTime.UtcNow;
        var ts = dt.ToUnixTime();
        Console.WriteLine($"DateTime -> Unix: {ts}");
        
        var back = UnixTime.FromUnixTime(ts);
        Console.WriteLine($"Unix -> DateTime: {back}");
    }
}

สรุปแนะนำ

สถานการณ์วิธีแนะนำ
General Purpose (.NET 4.6+)DateTimeOffset.UtcNow.ToUnixTimeSeconds()
High Precision (ms)DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
Legacy (.NET < 4.6)(DateTime.UtcNow - epoch).TotalSeconds
Convert BackDateTimeOffset.FromUnixTimeSeconds(ts).UtcDateTime
Database (EF Core)ใช้ DateTimeOffset หรือ long column

⚠️ ข้อควรระวัง

  • ใช้ UTC เสมอ (DateTime.UtcNow หรือ DateTimeOffset.UtcNow) เพื่อหลีกเลี่ยง Timezone Issue
  • DateTime.Now ใช้ Local Time → ผลลัพธ์แตกต่างตาม Timezone ของ Server
  • 32-bit int หมดอายุ ปี 2038 → ใช้ long (int64) เสมอ
  • Leap Seconds: Unix Time ไม่นับ Leap Seconds (POSIX standard)