// convert datetime to unix epoch seconds
public static long ToUnixTime(DateTime date)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return Convert.ToInt64((date.ToUniversalTime() - epoch).TotalSeconds);
}
应该使用ToUniversalTime()作为DateTime对象 .
5
如果您想获得更好的性能,可以使用此版本 .
public const long UnixEpochTicks = 621355968000000000;
public const long TicksPerMillisecond = 10000;
public const long TicksPerSecond = TicksPerMillisecond * 1000;
//[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static DateTime FromUnixTimestamp(this long unixTime)
{
return new DateTime(UnixEpochTicks + unixTime * TicksPerSecond);
}
/// <summary>
/// DateTime as UTV for UnixEpoch
/// </summary>
public static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
/// <summary>
/// Per JWT spec:
/// Gets the number of seconds from 1970-01-01T0:0:0Z as measured in UTC until the desired date/time.
/// </summary>
/// <param name="datetime">The DateTime to convert to seconds.</param>
/// <remarks>if dateTimeUtc less than UnixEpoch, return 0</remarks>
/// <returns>the number of seconds since Unix Epoch.</returns>
public static long GetIntDate(DateTime datetime)
{
DateTime dateTimeUtc = datetime;
if (datetime.Kind != DateTimeKind.Utc)
{
dateTimeUtc = datetime.ToUniversalTime();
}
if (dateTimeUtc.ToUniversalTime() <= UnixEpoch)
{
return 0;
}
return (long)(dateTimeUtc - UnixEpoch).TotalSeconds;
}
10 回答
我认为你的意思是Unix time,它被定义为1970年1月1日午夜(UTC)以来的秒数 .
有了LukeH的全部功劳,我将一些扩展方法放在一起以方便使用:
请注意以下来自CodesInChaos的评论,上面的
FromUnixTime
返回一个带有Kind
Utc
的DateTime
,这很好,但上面的ToUnixTime
更令人怀疑,因为它没有考虑给定的date
是什么类型的DateTime
. 要允许date
的Kind
为Utc
或Local
,请使用ToUniversalTime:ToUniversalTime
会将Local
(或Unspecified
)DateTime
转换为Utc
.如果你不想在从DateTime移动到epoch时创建epoch DateTime实例,你也可以这样做:
latest version of .Net (v4.6)刚刚添加了对Unix时间转换的内置支持 . 这包括来自Unix时间和来自Unix或毫秒的时间 .
DateTimeOffset
:DateTimeOffset
到Unix时间秒:DateTimeOffset
:DateTimeOffset
到Unix时间,以毫秒为单位:注意:这些方法与
DateTimeOffset
进行转换 . 要获得DateTime
表示,只需使用DateTimeOffset.DateTime
属性:你实际上想要AddMilliseconds(毫秒),而不是秒 . 添加秒将使您超出范围异常 .
应该使用ToUniversalTime()作为DateTime对象 .
如果您想获得更好的性能,可以使用此版本 .
从net471下的快速基准测试(BenchmarkDotNet)我得到这个数字:
比LukeH's version快2倍(如果是表演者)
这与DateTime内部工作方式类似 .
我使用以下扩展方法进行纪元转换
如果您需要将包含
UNIX time
的timeval struct(秒,微秒)转换为DateTime
而不会丢失精度,请按以下方式操作:如果你没有使用4.6,这可能会有所帮助来源:System.IdentityModel.Tokens
这是我的解决方案: