С благодарностью LukeH я собрал несколько методов расширения для легкого использования:
public static DateTime FromUnixTime(this long unixTime)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return epoch.AddSeconds(unixTime);
}
public static long ToUnixTime(this DateTime date)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return Convert.ToInt64((date - epoch).TotalSeconds);
}
Обратите внимание на комментарий ниже от CodesInChaos о том, что вышеуказанное FromUnixTime
возвращает DateTime
с Kind
из Utc
, что хорошо, но вышеприведенное ToUnixTime
гораздо более подозрительно, поскольку не учитывает для какого DateTime
дано date
. Чтобы date
Kind
было Utc
или Local
, используйте ToUniversalTime
:
public static long ToUnixTime(this DateTime date)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return Convert.ToInt64((date.ToUniversalTime() - epoch).TotalSeconds);
}
ToUniversalTime
преобразует Local
(или Unspecified
) DateTime
в Utc
.
если вы не хотите создавать экземпляр DateTime эпохи при переходе от DateTime к эпохе, вы также можете сделать:
public static long ToUnixTime(this DateTime date)
{
return (date.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
}