0

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

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

值的一个示例是 1236772829。

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

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

4

2 回答 2

4

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

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

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

或者,自己做算术并调用DateTime构造函数,该构造函数需要一些 ticks。(可以说,采用 a 的版本DateTimeKind会更好,因此您可以明确声明它是 UTC。)

于 2009-03-13T10:43:10.370 回答
3

谷歌搜索那个确切的短语给了我这个 Cicso 页面,它继续说“该字段指定了一个从操作系统获得的 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 的正确解释。

于 2009-03-13T10:56:22.273 回答