你如何在C#中转换纪元时间?

hsa*_*ite 356 c# time epoch

如何在C#中将Unix 纪元时间转换为实时?(Epoch开始于1970年1月1日)

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)

  • 为了使其正常工作,我必须将.AddSeconds更改为.AddMilliseconds.您需要知道您的号码是来自秒还是毫秒才能获得正确的结果.例如,以下日期:1406310305188(2014年7月25日).http://www.epochconverter.com/还可以让您检查转换结果. (69认同)
  • @jrandomuser:自纪元以来,Unix纪元时间传统上表示为*秒*.自从The Epoch(例如,JavaScript)以来使用*毫秒*变得很普遍,但经典的定义是秒.最重要的是,只知道你的输入值是什么(秒,毫秒,刻度,等等),并使用正确的`AddXYZ`方法. (6认同)
  • 您应该将参数类型更改为double(因为AddSeconds接受double,因此将向下转换为double)或向方法描述添加免责声明,该参数将仅保留64位精度中的53位. (5认同)

i3a*_*non 190

最新版本的.NET(V4.6)的用于Unix时间转换只是增加了内置支持.这包括来自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)
  • Unix时间(以毫秒为单位)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返回DateTimeKindUtc,这是很好的,但上面ToUnixTime更加犯罪嫌疑人不占什么样的DateTime给定date的.要允许dateKind是无论是UtcLocal,使用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)转换DateTimeUtc.

如果你不想在从DateTime移动到epoch时创建epoch DateTime实例,你也可以这样做:

public static long ToUnixTime(this DateTime date)
{
    return (date.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
}
Run Code Online (Sandbox Code Playgroud)

  • @KristianB:"Unix时间"传统上是秒,而不是毫秒,自The Epoch以来,虽然这些天我很谨慎检查某人使用的定义.秒已经足够好了,并且在签名的32位值中给了我们一个合理的范围.(这就是为什么在1月19日凌晨3点14分之后,格林尼治标准时间2038可能对某些人来说是一个糟糕的时间......)使用毫秒是一种更现代的做法,这要归功于我们经常能够抛出64位值(两者都是积分的)和双精度IEEE-754)...... (7认同)
  • 如果日期在Utc中,`ToUnixTime`只能正常工作.添加支票或转换支票.(我个人更喜欢支票) (6认同)
  • 谢谢你的代码.在创建Epoch基础时只需要一点建议:确保明确将毫秒值设置为0.即var epoch = new DateTime(1970,1,1,0/*h*/,0/*m*/,0/*s*/,0/*ms*/,DateTimeKind.Utc); 如果你没有明确地设置它,毫秒值似乎是1.这导致我的测试中出现一些不一致. (5认同)
  • 刚刚花了一个小时弄清楚为什么这不起作用。你需要在`毫秒`*而不是*秒内工作!!! (2认同)
  • 你应该使用`AddMilliseconds`并且你应该使用Double NOT Float。否则,你会以错误的时间结束。 (2认同)

小智 23

你实际上想要AddMilliseconds(毫秒),而不是秒.添加秒将使您超出范围异常.


小智 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内部工作方式类似.


Vin*_*tav 8

使用方法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)

并转换EpochDateTime下面的方法

private DateTime Epoch2UTCNow(int epoch) 
{
    return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(epoch); 
}
Run Code Online (Sandbox Code Playgroud)

  • [DateTime.Ticks](https://learn.microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=netframework-4.8) - 每个刻度为“一百纳秒”,使其成为额外的时间要记住的“事”。如果省略两个“.Ticks”,人们将从 DateTime 减法中得到一个很好的 TimeSpan 实例。 (3认同)

Gre*_* Su 7

// 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对象.


fai*_*813 5

我使用以下扩展方法进行纪元转换

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)


Ahm*_*hak 5

目前你可以简单地使用

DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
Run Code Online (Sandbox Code Playgroud)

它将作为 64 位长返回