如何获取C#中的unix时间戳

我已经看了一下周围的计算器,甚至看了一些build议的问题,似乎没有人回答,你怎么在C#中获得unix时间戳?

通过使用DateTime.UtcNow并减去1970-01-01的epoc时间,在C#中得到一个unix时间戳。

例如

Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; 

DateTime.Now可以replace为任何你想得到unix时间戳的DateTime对象。

从.NET 4.6起,有DateTimeOffset.ToUnixTimeSeconds()


这是一个实例方法,因此您需要在DateTimeOffset实例上调用它。 您也可以施放任何DateTime实例,但要注意时区 。

获取当前时间戳(本地时区):

 DateTimeOffset.Now.ToUnixTimeSeconds() 

DateTime获取时间戳:

 DateTime foo = DateTime.Now; long unixTime = ((DateTimeOffset)foo).ToUnixTimeSeconds(); 

你也可以使用蜱虫。 我为Windows Mobile编码,所以没有完整的方法。 TotalSeconds不适用于我。

 long epochTicks = new DateTime(1970, 1, 1).Ticks; long unixTime = ((DateTime.UtcNow.Ticks - epochTicks) / TimeSpan.TicksPerSecond); 

要么

 TimeSpan epochTicks = new TimeSpan(new DateTime(1970, 1, 1).Ticks); TimeSpan unixTicks = new TimeSpan(DateTime.UtcNow.Ticks) - epochTicks; double unixTime = unixTicks.TotalSeconds; 

这是我使用的:

 public long UnixTimeNow() { var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)); return (long)timeSpan.TotalSeconds; } 

请记住,此方法将以统一协调时间(UTC)返回时间。

截断.TotalSeconds非常重要,因为它被定义为the value of the current System.TimeSpan structure expressed in whole fractional seconds.

那么如何为DateTime的扩展? 第二个可能更混乱,它是值得的,直到属性扩展存在。

 /// <summary> /// Converts a given DateTime into a Unix timestamp /// </summary> /// <param name="value">Any DateTime</param> /// <returns>The given DateTime in Unix timestamp format</returns> public static int ToUnixTimestamp(this DateTime value) { return (int)Math.Truncate((value.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalSeconds); } /// <summary> /// Gets a Unix timestamp representing the current moment /// </summary> /// <param name="ignored">Parameter ignored</param> /// <returns>Now expressed as a Unix timestamp</returns> public static int UnixTimestamp(this DateTime ignored) { return (int)Math.Truncate((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds); } 

当您从当前时间减去1970年时,请注意时间跨度通常会有一个非零毫秒字段。 如果由于某种原因您对毫秒感兴趣,请记住这一点。

这是我做了解决这个问题。

  DateTime now = UtcNow(); // milliseconds Not included. DateTime nowToTheSecond = new DateTime(now.Year,now.Month,now.Day,now.Hour,now.Minute,now.Second); TimeSpan span = (date - new DateTime(1970, 1, 1, 0, 0, 0, 0)); Assert.That(span.Milliseconds, Is.EqualTo(0)); // passes. 

这是我用的。

  public class TimeStamp { public Int32 UnixTimeStampUTC() { Int32 unixTimeStamp; DateTime currentTime = DateTime.Now; DateTime zuluTime = currentTime.ToUniversalTime(); DateTime unixEpoch = new DateTime(1970, 1, 1); unixTimeStamp = (Int32)(zuluTime.Subtract(unixEpoch)).TotalSeconds; return unixTimeStamp; } } 

这个解决scheme有助于我的情况:

  public class DateHelper { public static double DateTimeToUnixTimestamp(DateTime dateTime) { return (TimeZoneInfo.ConvertTimeToUtc(dateTime) - new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc)).TotalSeconds; } } 

在代码中使用助手:

 double ret = DateHelper.DateTimeToUnixTimestamp(DateTime.Now) 

我将最优雅的方法拼接在一起实用的方法:

 public static class Ux { public static long ToUnixTimestampSecs(this DateTime date) => ToUnixTimestampTicks(date) / TimeSpan.TicksPerSecond; public static long ToUnixTimestampTicks(this DateTime date) => date.ToUniversalTime().Ticks - UnixEpochTicks; private static readonly long UnixEpochTicks = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks; }