【问题标题】:C#: Get unix timestamp with microsecondsC#:以微秒为单位获取 unix 时间戳
【发布时间】:2021-11-18 17:26:40
【问题描述】:

如何在 .NET 5 中获取当前的 unix 时间戳(以微秒为单位)?我环顾四周,只找到了一种使用ToUnixTimeMilliseconds 以毫秒为单位的方法,而没有任何包含微秒的方法。

【问题讨论】:

  • 你为什么要这个?这很重要。 Unix 时间戳的定义有些松散,本质上是一个实现细节。所有 .NET 库都使用日期。所有数据库都有日期类型。
  • @PanagiotisKanavos:有很多地方使用 Unix 时间戳进行通信。它是一个库的时代可能是一个实现细节,但当它是 API 规范的一部分时,它不是。
  • 如果你真的想要一个以微秒为单位的 Unix 时间戳,你可以使用 DateTime 或 DateTimeOffset 的 Ticks 属性,它从 0001-01-01 开始以 100ns 为增量计数。要使用 1970 作为基础,您必须从当前时间中减去它,然后将结果的刻度乘以 10
  • @PanagiotisKanavos:没错——这就是我要写的答案。 (除以 10 而不是相乘。)
  • @PanagiotisKanavos:是的。 (UtcDateTime.Ticks / (TimeSpan.TicksPerMillisecond / 1000))

标签: c# .net .net-5


【解决方案1】:

您只需从 DateTimeOffset 中减去 Unix 纪元 (1970-01-01T00:00:00Z) 即可得到 TimeSpan,然后通过将滴答的总数除以 10 得到微秒:

using System;

public static class DateTimeOffsetExtensions
{
    private static readonly DateTimeOffset UnixEpoch =
        new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero);

    public static long ToUnixTimeMicroseconds(this DateTimeOffset timestamp)
    {
        TimeSpan duration = timestamp - UnixEpoch;
        // There are 10 ticks per microsecond.
        return duration.Ticks / 10;
    }
}

public class Test
{
    static void Main()
    {
        DateTimeOffset now = DateTimeOffset.UtcNow;
        Console.WriteLine(now.ToUnixTimeMicroseconds());
    }
}

【讨论】:

  • 绝对是这样。但仍然认为用户需要以微秒为单位的当前时间戳
  • 但是请乔恩,你的分数还不够吗? :D 我没有立即回答,而是试图通过链接他已经找到的方法的来源让他意识到如何做到这一点。啊没关系。顺便说一句,一个很好的答案。
  • @LeandroBardelli:如果他们需要以微秒为单位的当前时间戳,他们可以使用DateTimeOffset.UtcNow.ToUnixTimeMicroseconds(),这基本上就是示例代码的作用。
  • @omajid:是的,绝对 - 现在已修复,谢谢。
  • @gshpychka:不,确实如此。见docs.microsoft.com/en-us/dotnet/api/…的备注部分。 “Ticks 属性的值表示自 0001 年 1 月 1 日午夜 12:00:00 以来经过的 100 纳秒间隔数(MinValue 的值)。”请注意,这是DateTimeOffset.Ticks - 如果我们谈论的是Stopwatch.Ticks,那就另当别论了。
猜你喜欢
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
相关资源
最近更新 更多