如何将DateTime转换为自1970年以来的秒数?


119

我正在尝试将C#DateTime变量转换为Unix时间,即自1970年1月1日以来的秒数。看来DateTime实际上是自0001年1月1日以来实现的“滴答”数。

我目前的想法是从DateTime中减去1970年1月1日,如下所示:

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

有没有更好的办法?


Answers:


195

基本上就是这样。这些是我用来在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和.Net Standard 2.1开始,可以从static获得与Unix Epoch相等的DateTime DateTime.UnixEpoch


1
值得注意的是,如果要转换为毫秒以获取更准确的时间戳或与Javascript Date()对象兼容,则需要使用long而不是int作为时间戳类型。
苏联2013年

3
没有为我工作。这个答案的伎俩:stackoverflow.com/questions/249760/...
Zeezer

@Jonny-ToUniversalTime()转换为UTC,因此它确实说明了UTC。
Dave Swersky 2014年

4
DateTime来源=新的DateTime(1970,1,1,0,0,0,0,DateTimeKind.Utc); 有趣的是,没有人建议这样做。很多时候,您会用毫秒表示Utc时间。而且,如果您t specify this explicitly and somewhere later in code you没有ToUniversalTime(),则最终Utc时间会很糟糕,因为默认情况下DateTime不是NOT Utc。
偷偷摸摸

52

如果使用DateTimeOffset代替DateTime可以使系统的其余部分正常,则有一个非常方便的功能:

long unixSeconds = DateTimeOffset.Now.ToUnixTimeSeconds();

7
这是一个干净的方式,但它是只适用于框架4.6 msdn.microsoft.com/en-us/library/...
奥斯卡Fraxedas

1
真好 当然,要从Unix转换为DateTimeOffset,您可以使用var time = DateTimeOffset.FromUnixTimeSeconds(5000); MS Doc
Jordan

22

我唯一看到的是应该是从UTC 1970年1月1日午夜开始

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

7
应该是DateTime.UtcNow吗?
oferei

14

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

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

避免时区问题的唯一方法是:1)保持对时区的无知,仅支持一个时区,或2)在与另一个系统或最终用户进行交互的任何地方(至少)处理时区。特别是,在内部任何地方使用UTC只是战斗的一部分。在第一种情况下,添加UTC日期时间实际上会使问题变得更糟,直到您准备好完成所有(2)为止,因为您从支持任何一个时区变为仅支持UTC。
jpaugh

1

如果所讨论的日期时间采用UTC或表示从未观察到夏令时的区域中的本地时间,则该方法将是不错的选择。DateTime差异例程没有考虑夏令时,因此会将6月1日午夜视为1月1日午夜之后24小时的倍数。我不知道Windows中有任何报告当前历史夏时制规则的东西。区域设置,因此我认为在最近的夏令时规则更改之前,没有任何方法可以正确处理任何时间。



0

我在微积分中使用2000年而不是大纪元时间。使用较小的数字易于存储和运输,并且支持JSON。

公元2000年是第二纪年946684800。

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

DateTime.UtcNow计时从0001年1月1日开始

从2000年开始的秒数

DateTime.UtcNow.Ticks/10000000-63082281600

从Unix时间开始的秒数:

DateTime.UtcNow.Ticks/10000000-946684800

例如,2020年是:

var year2020 =(new DateTime())。AddYears(2019).Ticks; //因为DateTime已经从第1年开始

637134336000000000从0001年1月1日开始计时

63713433600自0001年1月1日以来的秒数

自大纪元以来1577836800秒

631152000秒自2000年以来

参考文献:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.