我有一个遗留的数据库,其中一个字段包含一个整数,代表UTC的日期时间。
文件中说:"CDR内的时间戳以世界协调时间(UTC)显示。该值不受夏令时变化的影响"。
一个值的例子是1236772829。
我的问题是,将其转换为.NET DateTime(在CLR代码中,而不是在DB中)的最佳方法是什么,既可以作为UTC值,也可以作为本地时间值。
我试着在谷歌上搜索,但没有任何收获。
在谷歌上搜索这句话,得到的结果是:"在CDR中的时间戳是以统一协调时间(UTC)显示的。此Cicso页面,它接着说:"该字段指定了一个从操作系统获得的time_t值。"
时间_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_t
s.
你需要知道整数的真正含义。这通常包括
如果你能得到两个值以及它们在UTC方面的含义,剩下的应该很容易。最简单的方法可能是有一个 DateTime
(或 DateTimeOffset
)作为纪元,然后构建一个 TimeSpan
从整数,如 TimeSpan.FromMilliseconds
等。将两者相加就可以了。EDIT: 使用 AddSeconds
或 AddMilliseconds
按照 阿卡什姆的回答 是一个更简单的方法来完成这一点 :)
或者,你可以自己进行运算,然后调用 DateTime
构造函数. (可以说,这个版本采取的是 DateTimeKind
以及会更好,所以你可以明确地说明它是UTC)。)