你如何在C#中转换时代?

如何将Unix 时代转换为C#中的实时? (大纪元1970年1月1日开始)

我认为你的意思是Unix时间 ,它定义为1970年1月1日午夜(UTC)以来的秒数。

public static DateTime FromUnixTime(long unixTime) { return epoch.AddSeconds(unixTime); } private static readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 

所有功劳卢克,我已经放在一起的一些扩展方法,以方便使用:

 public static DateTime FromUnixTime(this long unixTime) { var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); return epoch.AddSeconds(unixTime); } public static long ToUnixTime(this DateTime date) { var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); return Convert.ToInt64((date - epoch).TotalSeconds); } 

注意CodesInChaos下面的注释,上面的FromUnixTime返回一个KindUtcDateTime ,这很好,但是上面的ToUnixTime更令人怀疑,因为它没有考虑给定date是什么类型的DateTime 。 要允许dateKindUtcLocal ,请使用ToUniversalTime

 public static long ToUnixTime(this DateTime date) { var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); return Convert.ToInt64((date.ToUniversalTime() - epoch).TotalSeconds); } 

ToUniversalTime会将Local (或未UnspecifiedDateTime转换为Utc

如果您不想在从DateTime移动到时代时创建新纪元DateTime实例,则还可以执行以下操作:

 public static long ToUnixTime(this DateTime date) { return (date.ToUniversalTime().Ticks - 621355968000000000) / 10000000; } 

最新版本的.Net(v4.6)只是增加了对Unix时间转换的内置支持。 这包括来自和来自Unix时间的时间,以秒或毫秒表示。

  • Unix时间在几秒钟内DateTimeOffset
 DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(1000); 
  • Unix时间的DateTimeOffset秒数:
 long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds(); 
  • Unix时间以毫秒为单位DateTimeOffset
 DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000); 
  • DateTimeOffset到Unix时间(以毫秒为单位):
 long unixTimeStampInMilliseconds= dateTimeOffset.ToUnixTimeMilliseconds(); 

注意:这些方法可以从DateTimeOffset转换到或来自DateTimeOffset 。 要获取DateTime表示,只需使用DateTimeOffset.DateTime属性:

 DateTime dateTime = dateTimeOffset.UtcDateTime; 

你实际上想要增加毫秒(毫秒),而不是秒。 添加秒会给你一个超出范围的例外。

 // convert datetime to unix epoch seconds public static long ToUnixTime(DateTime date) { var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); return Convert.ToInt64((date.ToUniversalTime() - epoch).TotalSeconds); } 

应该使用ToUniversalTime()作为DateTime对象。

我使用以下扩展方法进行时代转换

 public static int GetEpochSeconds(this DateTime date) { TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1); return (int)t.TotalSeconds; } public static DateTime FromEpochSeconds(this DateTime date, long EpochSeconds) { var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); return epoch.AddSeconds(EpochSeconds); } 

如果您需要将包含UNIX time的timeval结构 (秒,微秒)转换为DateTime而不会丢失精度,则以下方法:

 DateTime _epochTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); private DateTime UnixTimeToDateTime(Timeval unixTime) { return _epochTime.AddTicks( unixTime.Seconds * TimeSpan.TicksPerSecond + unixTime.Microseconds * TimeSpan.TicksPerMillisecond/1000); } 

如果你不使用4.6,这可能有助于Source: System.IdentityModel.Tokens

  /// <summary> /// DateTime as UTV for UnixEpoch /// </summary> public static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); /// <summary> /// Per JWT spec: /// Gets the number of seconds from 1970-01-01T0:0:0Z as measured in UTC until the desired date/time. /// </summary> /// <param name="datetime">The DateTime to convert to seconds.</param> /// <remarks>if dateTimeUtc less than UnixEpoch, return 0</remarks> /// <returns>the number of seconds since Unix Epoch.</returns> public static long GetIntDate(DateTime datetime) { DateTime dateTimeUtc = datetime; if (datetime.Kind != DateTimeKind.Utc) { dateTimeUtc = datetime.ToUniversalTime(); } if (dateTimeUtc.ToUniversalTime() <= UnixEpoch) { return 0; } return (long)(dateTimeUtc - UnixEpoch).TotalSeconds; } 

这是我的解决方案:

 public long GetTime() { DateTime dtCurTime = DateTime.Now.ToUniversalTime(); DateTime dtEpochStartTime = Convert.ToDateTime("1/1/1970 0:00:00 AM"); TimeSpan ts = dtCurTime.Subtract(dtEpochStartTime); double epochtime; epochtime = ((((((ts.Days * 24) + ts.Hours) * 60) + ts.Minutes) * 60) + ts.Seconds); return Convert.ToInt64(epochtime); }