DateTimeOffset 在 C# 4.6 新增了 ToUnixTimeSeconds 方法,可以取得跟 UnixTime 之間差的秒數。

有些時候我們會需要跟 UnixTime 之間差的秒數,但是不需要 TimeZone 資訊,這時我們其實不需要從 DateTime 換成 DateTimeOffset,只要自行跟 UnixTime 相減再取 TotalSeconds 即可。

為了便於使用,這邊將它包成擴充方法。

using System;

namespace TimestampTest
{
public static class DateTimeExtension
{
private static readonly DateTime _unixTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

public static int ToUnixTimeSeconds(this DateTime dateTime)
{
return (int) dateTime.Subtract(_unixTime).TotalSeconds;
}
}
}

使用上會像下面這樣:

var unitTimeSeconds = DateTime.UtcNow.ToUnixTimeSeconds();

這邊筆者撰寫了個簡單的程式做個測試。

using System;
using System.Diagnostics;

namespace TimestampTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(DateTime.UtcNow.ToUnixTimeSeconds());
Console.WriteLine(DateTimeOffset.UtcNow.ToUnixTimeSeconds());

var count = 10000000;
Console.WriteLine(DoTest(count, ()=> { DateTime.UtcNow.ToUnixTimeSeconds(); }));
Console.WriteLine(DoTest(count, ()=> { DateTimeOffset.UtcNow.ToUnixTimeSeconds(); }));
}

private static long DoTest(int count, Action action)
{
var sw = Stopwatch.StartNew();
for (var i = 0; i < count; ++i)
{
action();
}

return sw.ElapsedMilliseconds;
}
}
}

透過運行的結果可以看到值跟 DateTimeOffset 內建的 ToUnixTimeSeconds 是一致的,但速度上會比 DateTimeOffset 內建的 ToUnixTimeSeconds 還要快一點點,這部分應該是因為 DateTimeOffset 要多處理 TimeZone 的原因。

'C# - ToUnixTimeSeconds extension for DateTime'

最後附上測出來的速度比較數據。

TimesDateTimeDateTimeOffset
10000067
10000006173
10000000597713
10000000059197067
10000000005911870631

'C# - ToUnixTimeSeconds extension for DateTime'