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

Sli*_*345 111 c# datetime

我正在尝试将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;
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

Dav*_*sky 182

基本上就是这样.这些是我用来转换为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);
}
Run Code Online (Sandbox Code Playgroud)

  • 不适合我.这个答案起到了作用:http://stackoverflow.com/questions/249760/how-to-convert-unix-timestamp-to-datetime-and-vice-versa (3认同)
  • DateTime origin = new DateTime(1970,1,1,0,0,0,0,DateTimeKind.Utc); 有趣的是,没有人建议这样做.通常,您将有毫秒表示Utc时间.如果你没有明确地指定这个,那么稍后在代码中你将拥有ToUniversalTime()而不是你最终得到糟糕的Utc时间,因为默认情况下DateTime不是Utc. (3认同)

cod*_*key 44

如果系统的其余部分使用DateTimeOffset而不是DateTime,那么有一个非常方便的功能:

long unixSeconds = DateTimeOffset.Now.ToUnixTimeSeconds();
Run Code Online (Sandbox Code Playgroud)

  • 这是一种更简洁的方法,但它仅在框架4.6中提供https://msdn.microsoft.com/en-us/library/system.datetimeoffset.tounixtimeseconds(v=vs.110).aspx (7认同)

Caf*_*eek 22

我唯一看到的是它应该是自UTC 1970年1月1日午夜以来

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc));
return span.TotalSeconds;
Run Code Online (Sandbox Code Playgroud)

  • 它应该是DateTime.UtcNow吗? (6认同)

Dav*_*vid 14

您可能希望使用DateTime.UtcNow来避免时区问题

TimeSpan span= DateTime.UtcNow.Subtract(new DateTime(1970,1,1,0,0,0)); 
Run Code Online (Sandbox Code Playgroud)