c#转换UTC int到DateTime对象

本文关键字:DateTime 对象 int 转换 UTC | 更新日期: 2023-09-27 18:01:18

我不知道为什么这么复杂!

我有一个插件,正在传递一个长int UTC。我需要将该数字转换为DateTime以查询我的数据库(SQL Server)。

我不知道为什么,但是我无法从基本的谷歌搜索中找到一个可行的答案。

(为了获得额外的学分,我需要在一天结束时将返回的DateTime转换回UTC。)

问这样一个基本的问题真尴尬!:)

c#转换UTC int到DateTime对象

我猜它将是毫秒或秒从一个特定的纪元-很可能是Unix纪元1970年1月1日,午夜UTC。

所以代码看起来像这样:
private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0,
                                                          DateTimeKind.Utc);
public static DateTime FromMillisecondsSinceUnixEpoch(long milliseconds)
{
    return UnixEpoch.AddMilliseconds(milliseconds);
}

在几秒钟内进行明显的更改,或者从不同的纪元开始:)

另一种方法是创建自epoch以来的秒/毫秒的TimeSpan,然后将其添加到epoch:

private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0,
                                                          DateTimeKind.Utc);
public static DateTime FromMillisecondsSinceUnixEpoch(long milliseconds)
{
    return UnixEpoch + TimeSpan.FromMilliseconds(milliseconds);
}

我不知道它们之间有任何显着差异-尽管AddMilliseconds采用double而不是long这一事实表明,对于非常大的值,TimeSpan方法可能更可取。但我怀疑它会有什么不同:)

你得到的是秒、毫秒还是什么?在将其转换为刻度(一个。net刻度是100纳秒)之后,例如通过long ticks = theDBDateNum*TimeSpan.TicksPerMillisecond;,尝试如下:

DateTime theDate = new DateTime(ticks, DateTimeKind.Utc);

根据https://www.epochconverter.com/,

Unix纪元(或Unix时间或POSIX时间或Unix时间戳)是自1970年1月1日(午夜UTC/GMT)以来经过的秒数,不包括闰秒。

,

var epoch = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;

之后,

private string epoch2string(int epoch) {
return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(epoch).ToShortDateString(); }