【问题标题】:Timestamp as UTC Integer时间戳为 UTC 整数
【发布时间】:2009-03-13 10:41:14
【问题描述】:

我有一个旧数据库,其中包含一个表示 UTC 日期时间的整数的字段

来自文档: “CDR 中的时间戳以通用协调时间 (UTC) 显示。此值保持不变 独立于夏令时变化”

一个值的例子是 1236772829。

我的问题是将其转换为 .NET DateTime(在 CLR 代码中,而不是在 DB 中)的最佳方式是什么,既可以作为 UTC 值,也可以作为本地时间值。

曾尝试用谷歌搜索,但没有任何运气。

【问题讨论】:

    标签: c# utc


    【解决方案1】:

    您需要知道整数的真正含义。这通常包括:

    • 一个纪元/偏移量(即 0 的含义) - 例如“1970 年 1 月 1 日午夜”
    • 比例尺,例如秒、毫秒、滴答声。

    如果您可以获得两个值以及它们在 UTC 方面的含义,那么其余的应该很容易。最简单的方法可能是将DateTime(或DateTimeOffset)作为纪元,然后从整数构造一个TimeSpan,例如TimeSpan.FromMilliseconds 等。将两者加在一起就完成了。编辑:按照aakashm's answer 使用AddSecondsAddMilliseconds 是一种更简单的方法:)

    或者,您也可以自己算术并致电DateTime constructor which takes a number of ticks。 (可以说采用DateTimeKind 的版本会更好,因此您可以明确声明它是UTC。)

    【讨论】:

    • 你也可以猜到@Jon 的例子是正确的,看看你的日期如果从 1970 年 1 月 1 日开始计算是否有意义。我猜他们会的。
    【解决方案2】:

    谷歌搜索那个确切的短语给了我this Cicso page,它接着说“该字段指定了一个从操作系统获得的 time_t 值。”

    time_t 是一个 C 库概念,严格来说不必是任何特定的实现,但 通常 对于 UNIX-y 系统,它将是自 Unix 启动以来的秒数纪元,1970 年 1 月 1 日 00:00。

    假设这是正确的,这段代码会给你一个来自 int 的 DateTime:

            DateTime epochStart = new DateTime(1970, 1, 1);
    
            int cdrTimestamp = 1236772829;
    
            DateTime result = epochStart.AddSeconds(cdrTimestamp);
    
            // Now result is 2009 March 11 12:00:29
    

    你应该仔细检查你得到的结果,以确认这是对这些time_ts 的正确解释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多