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 Back | DateTimeOffset.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)