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

最後附上測出來的速度比較數據。
| Times | DateTime | DateTimeOffset |
|:----------:|:--------:|:--------------:|
| 100000 | 6 | 7 |
| 1000000 | 61 | 73 |
| 10000000 | 597 | 713 |
| 100000000 | 5919 | 7067 |
| 1000000000 | 59118 | 70631 |
