如何将日期时间转换为自1970年以来的秒数?

我正在尝试将一个 C # DateTime 变量转换为 Unix 时间,即1970年1月1日以来的秒数。从0001年1月1日开始,DateTime 看起来实际上是以“刻度”的数量来实现的。

我现在的想法是这样把1970年1月1日从我的日期时间中减去:

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0));
return span.TotalSeconds;

还有更好的办法吗?

224684 次浏览

基本上就是这样。这些是我用来转换 Unix 纪元时间的方法:

public static DateTime ConvertFromUnixTimestamp(double timestamp)
{
DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
return origin.AddSeconds(timestamp);
}


public static double ConvertToUnixTimestamp(DateTime date)
{
DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
TimeSpan diff = date.ToUniversalTime() - origin;
return Math.Floor(diff.TotalSeconds);
}

更新: 截至。Net Core 2.1和。可以从静态 DateTime.UnixEpoch获得等于 Unix Epoch 的 Net Standard 2.1 a DateTime。

我只看到它应该是从1970年1月1日午夜开始的

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc));
return span.TotalSeconds;

您可以创建 DateTime 的 startTime 和 endTime,然后执行 endTime.扣除(startTime)。然后输出 span。

我觉得应该可以。

您可能需要使用 DateTime.UtcNow 来避免时区问题

TimeSpan span= DateTime.UtcNow.Subtract(new DateTime(1970,1,1,0,0,0));

如果有问题的日期-时间是以协调世界时为单位,或者代表从未观测到夏时制的地区的当地时间,这种方法将是很好的。日期时间差异程序不会考虑夏时制,因此会将6月1日午夜视为1月1日午夜后24小时的倍数。我不知道 Windows 中有什么报告当前语言环境的历史夏令时规则,所以我不认为有什么好方法可以正确处理最近夏令时规则更改之前的任何时间。

如果系统的其他部分可以使用 DateTimeOffset 而不是 DateTime,那么有一个非常方便的特性:

long unixSeconds = DateTimeOffset.Now.ToUnixTimeSeconds();

我在微积分中用公元2000年代替了大纪元。使用较小的数字很容易存储和传输,并且是 JSON 友好的。

2000年是新纪元的第二个946684800年。

2000年是从0001年1月1日开始的第二个63082281600年。

日期时间。 UtcNow 标记从0001年1月1日开始

2000年起计秒数 :

DateTime.UtcNow.Ticks/10000000-63082281600

Unix 时间的几秒钟:

DateTime.UtcNow.Ticks/10000000-946684800

例如,2020年是:

Var year 2020 = (new DateTime ()) . AddYears (2019) . Ticks;//因为 DateTime 已经从第1年开始

63713436000000000自0001年1月1日以来

63713433600秒自0001年1月1日起

1577836800秒

631152000自2000年以来的秒数

参考文献:

纪元时间转换器: https://www.epochconverter.com

1年转换器: https://www.epochconverter.com/seconds-days-since-y0

协调世界时:

long timeSince1970 = DateTimeOffset.Now.ToUnixTimeSeconds();

当地时间:

long timeSince1970 = DateTime.Now.Ticks / 10000000 - 62135596800;