Luk*_*keH 533
我认为你的意思是Unix时间,它被定义为1970年1月1日午夜(UTC)以来的秒数.
public static DateTime FromUnixTime(long unixTime)
{
return epoch.AddSeconds(unixTime);
}
private static readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
Run Code Online (Sandbox Code Playgroud)
i3a*_*non 190
在最新版本的.NET(V4.6)的用于Unix时间转换只是增加了内置支持.这包括来自Unix时间和来自Unix或毫秒的时间.
DateTimeOffset
:DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(1000);
Run Code Online (Sandbox Code Playgroud)
DateTimeOffset
以秒为单位的Unix时间:long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds();
Run Code Online (Sandbox Code Playgroud)
DateTimeOffset
:DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000);
Run Code Online (Sandbox Code Playgroud)
DateTimeOffset
以毫秒为单位的Unix时间:long unixTimeStampInMilliseconds= dateTimeOffset.ToUnixTimeMilliseconds();
Run Code Online (Sandbox Code Playgroud)
注意:这些方法可以转换为DateTimeOffset
.要获得DateTime
表示,只需使用该DateTimeOffset.DateTime
属性:
DateTime dateTime = dateTimeOffset.UtcDateTime;
Run Code Online (Sandbox Code Playgroud)
Ben*_*ull 163
由于归功于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);
}
Run Code Online (Sandbox Code Playgroud)
注意下面从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);
}
Run Code Online (Sandbox Code Playgroud)
ToUniversalTime
将a Local
(或Unspecified
)转换DateTime
为Utc
.
如果你不想在从DateTime移动到epoch时创建epoch DateTime实例,你也可以这样做:
public static long ToUnixTime(this DateTime date)
{
return (date.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
}
Run Code Online (Sandbox Code Playgroud)
小智 9
如果您想获得更好的性能,可以使用此版本.
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);
}
Run Code Online (Sandbox Code Playgroud)
从net471下的快速基准测试(BenchmarkDotNet)我得到这个数字:
Method | Mean | Error | StdDev | Scaled |
-------------- |---------:|----------:|----------:|-------:|
LukeH | 5.897 ns | 0.0897 ns | 0.0795 ns | 1.00 |
MyCustom | 3.176 ns | 0.0573 ns | 0.0536 ns | 0.54 |
Run Code Online (Sandbox Code Playgroud)
对LukeH的版本速度提高2倍(如果是性能指标)
这与DateTime内部工作方式类似.
使用方法DateTimeOffset.ToUnixTimeMilliseconds() 返回自1970-01-01T00:00:00.000Z以来经过的毫秒数。
只有Framework 4.6或更高版本才支持
var EPOCH = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
Run Code Online (Sandbox Code Playgroud)
在此处有充分的记录DateTimeOffset.ToUnixTimeMilliseconds
另一种方法是使用以下内容
long EPOCH = DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1,0,0,0,0).Ticks;
Run Code Online (Sandbox Code Playgroud)
要仅用几秒钟获得EPOCH,您可以使用
var Epoch = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
Run Code Online (Sandbox Code Playgroud)
并转换Epoch
到DateTime
下面的方法
private DateTime Epoch2UTCNow(int epoch)
{
return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(epoch);
}
Run Code Online (Sandbox Code Playgroud)
// 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);
}
Run Code Online (Sandbox Code Playgroud)
应该使用ToUniversalTime()作为DateTime对象.
我使用以下扩展方法进行纪元转换
public static int GetEpochSeconds(this DateTime date)
{
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
return (int)t.TotalSeconds;
}
public static DateTime FromEpochSeconds(this DateTime date, long EpochSeconds)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return epoch.AddSeconds(EpochSeconds);
}
Run Code Online (Sandbox Code Playgroud)
目前你可以简单地使用
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
Run Code Online (Sandbox Code Playgroud)
它将作为 64 位长返回