你如何在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
返回一个Kind
为Utc
的DateTime
,这很好,但是上面的ToUnixTime
更令人怀疑,因为它没有考虑给定date
是什么类型的DateTime
。 要允许date
的Kind
是Utc
或Local
,请使用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
(或未Unspecified
) DateTime
转换为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); }